Oracle 設計哲學偏好單一強大函數而非多個專用函數。SUBSTR 通過靈活的參數組合,完全涵蓋 LEFT、RIGHT、MID 等功能,減少函數名稱空間佔用,且行為跨平台一致 (PL/SQL、SQL 通用)。
SUBSTR(string, position [, substring_length])
string:來源字串 (字面值、欄位、運算式)。position:起始位置 從 1 開始計算。
substring_length:擷取長度 (字元數)。
NULL (空字串在 Oracle 視為 NULL)。| 需求 | 函數呼叫 | 結果 | 說明 |
|---|---|---|---|
| 左側 3 字元 | SUBSTR('ABCDEFG', 1, 3) | ABC | 相當於 LEFT(str,3) |
| 第 3 字元起 2 字元 | SUBSTR('ABCDEFG', 3, 2) | CD | 相當於 MID(str,3,2) |
| 右側 3 字元 | SUBSTR('ABCDEFG', -3) | EFG | 相當於 RIGHT(str,3) |
| 第 6 字元至結尾 | SUBSTR('ABCDEFG', 6) | FG | 省略長度參數 |
| 倒數第 5 字元起 2 字元 | SUBSTR('ABCDEFG', -5, 2) | CD | 負位置 + 長度 |
| 超出範圍 (向前不足) | SUBSTR('ABCDEFG', -8, 7) | NULL | 位置超出字串長度 |
| 小數捨去 | SUBSTR('ABCDEFG', 2.6, 2.2) | BC | 2.6→2, 2.2→2 |
SUBSTR:**按字元計算**,中英文各佔 1 字元。SUBSTR('智能ABC', 2, 2) = '能A'。SUBSTRB:**按位元組計算**,適用於定長位元組切割。SUBSTRB('智能ABC', 3, 4) = '能AB' (假設 AL32UTF8 中文 3 bytes)。SUBSTRC:按 Unicode 完整字元 (Code Point) 計算,處理增補字元 (Emoji 等) 正確。SUBSTR2:按 UCS-2 代碼單元計算。SUBSTR4:按 UCS-4 代碼單元計算。建議:現代系統統一使用 AL32UTF8,優先用 SUBSTR (字元語意);僅在處理二進位資料、舊系統介接時用 SUBSTRB。
-- 移除前綴 'ERR_'
SUBSTR(err_code, 5) -- 從第 5 字元到結尾
-- 移除後綴 '_LOG'
SUBSTR(log_name, 1, LENGTH(log_name) - 4)
-- 取 '@' 前的帳號部份
SUBSTR(email, 1, INSTR(email, '@') - 1)
-- 取最後一個 '/' 後的檔名
SUBSTR(file_path, INSTR(file_path, '/', -1) + 1)
-- 取第一組數字
REGEXP_SUBSTR('Order 12345 Date', '\d+')
-- 取最後一組數字
REGEXP_SUBSTR('Order 12345 Date 2023', '\d+', 1, 1, 'i', 1) -- 需配合其他技巧
-- 集合批量處理範例
DECLARE
TYPE t_arr IS TABLE OF VARCHAR2(100) INDEX BY PLS_INTEGER;
v_src t_arr;
v_tgt t_arr;
BEGIN
v_src(1) := 'ABCDEFG'; v_src(2) := 'HIJKLMN';
FOR i IN v_src.FIRST .. v_src.LAST LOOP
v_tgt(i) := SUBSTR(v_src(i), -3); -- 取右 3 碼
END LOOP;
-- FORALL 寫入資料表...
END;
SUBSTR(str, -3) 正確;但 SUBSTR(str, -3, 0) 回傳 NULL。NVL 或 COALESCE 防護。AL32UTF8 但客戶端 ZHS16GBK 導致 LENGTH/SUBSTR 字元數計算差異,統一用 SUBSTR (字元語意) 並確保 NLS_LANG 正確。| 功能 | Oracle | SQL Server | MySQL/PostgreSQL |
|---|---|---|---|
| 左取 N 字元 | SUBSTR(str,1,N) | LEFT(str,N) | LEFT(str,N) / SUBSTRING(str,1,N) |
| 右取 N 字元 | SUBSTR(str,-N) | RIGHT(str,N) | RIGHT(str,N) / SUBSTRING(str,-N) |
| 中間截取 | SUBSTR(str,pos,len) | SUBSTRING(str,pos,len) | SUBSTRING(str,pos,len) |
掌握 SUBSTR 的正負位置與長度規則,即可在 Oracle 中靈活完成所有字串截取需求,無需羨慕其他資料庫的專用函數。