SUBSTR(string, start_position [, length])
| 參數 | 說明 | 關鍵特性 |
|---|---|---|
string | 源字符串 | 支持 CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB、NCLOB |
start_position | 起始位置 | 從 1 開始計數;負數表示從末尾倒數(-1 為最後一字符) |
length | 截取長度 | 可選;省略則截取至字符串末尾;負數報錯 ORA-01476 |
-- 基準字符串:'ABCDEFG' (長度 7)
SELECT
SUBSTR('ABCDEFG', 1, 3) AS pos1_len3, -- 'ABC' 正向從首字符取3位
SUBSTR('ABCDEFG', 3, 2) AS pos3_len2, -- 'CD' 正向從第3字符取2位
SUBSTR('ABCDEFG', -3, 2) AS neg3_len2, -- 'EF' 反向從倒數第3字符取2位
SUBSTR('ABCDEFG', -1) AS neg1_omit, -- 'G' 反向從最後1字符取至末尾
SUBSTR('ABCDEFG', 0, 2) AS zero_len2, -- 'AB' 0 視同 1(Oracle 兼容性行為)
SUBSTR('ABCDEFG', 5) AS pos5_omit -- 'EFG' 從第5字符取至末尾
FROM dual;
| 語言/函數 | 起始索引 | 負數索引含義 | 長度參數 |
|---|---|---|---|
| Oracle SUBSTR | 1 | 從末尾倒數 | 可選,省略至末尾 |
| Python 切片 [start:end] | 0 | 從末尾倒數 | end 為結束位置(不含) |
| Java substring(begin, end) | 0 | 不支持 | end 為結束位置(不含) |
| C# Substring(start, length) | 0 | 不支持 | 長度,可選 |
| JavaScript substr(start, length) | 0 | 從末尾倒數 | 長度,可選 |
遷移陷阱警示:從 0 基索引語言遷移 SQL 時,start_position 必須 +1,否則會導致首字符丟失或越界。
SUBSTR(col, -5) -- 最後 5 字符
-- 去除前 3 字符(如 'PRE_') SUBSTR(col, 4) -- 去除後 4 字符(如 '_SUF') SUBSTR(col, 1, LENGTH(col) - 4)
-- 假設記錄格式:ID(6) | NAME(20) | AMT(10) | DATE(8) SELECT SUBSTR(record, 1, 6) AS id, SUBSTR(record, 7, 20) AS name, SUBSTR(record, 27, 10) AS amt, SUBSTR(record, 37, 8) AS dt FROM staging_table;
-- 取 'a|bb|ccc' 中第 2 段('bb')
SELECT SUBSTR(
'a|bb|ccc',
INSTR('a|bb|ccc', '|', 1, 1) + 1,
INSTR('a|bb|ccc', '|', 1, 2) - INSTR('a|bb|ccc', '|', 1, 1) - 1
) FROM dual;
SUBSTR(col, 1, 1) = 'X' → col LIKE 'X%'(可用索引)BULK COLLECT 減少上下文切換記住鐵律:Oracle 字符串定位永遠從 1 開始,這是所有字符串函數(INSTR、LENGTH、REPLACE 等)的統一約定,與絕大多數編程語言截然不同。