本文彙整 Oracle 開發中最高頻的字串操作與數值格式化函數,包含四捨五入、填充/修剪、搜尋定位、子字串擷取,附帶參數說明、邊界行為與實戰範例,適合做為日常開發速查手冊。
num_digits 可為正(小數位)、負(十位、百位...)、零(整數)ROUND(5555.6666, 2) → 5555.67;ROUND(5555.6666, -2) → 5600LPAD(string, n, [pad_string]) -- 左填充
RPAD(string, n, [pad_string]) -- 右填充
n < LENGTH(string),則截取前 n 字元| 呼叫 | 結果 | 說明 |
|---|---|---|
LPAD('tech', 7) | ' tech' | 左填 3 空格 |
LPAD('tech', 2) | 'te' | 截取前 2 字元 |
LPAD('tech', 8, '0') | '0000tech' | 左填 0 補齊 8 位 |
RPAD('tech', 8, '0') | 'tech0000' | 右填 0 |
RPAD('tech on the net', 16, 'z') | 'tech on the netz' | 右填 1 個 z |
核心邏輯:逐字元比對,而非整體字串匹配。從左/右邊開始,只要字元出現在 trim_set 中就移除,直到遇到不在集合中的字元為止。
SELECT LTRIM('1092002081100058424', '109') FROM dual; -- '2002081100058424'
SELECT LTRIM('1091000000002671251', '109') FROM dual; -- '2671251'
SELECT LTRIM('1000000002671251', '1') FROM dual; -- '000000002671251'
SELECT LTRIM('1000000002671251', '10') FROM dual; -- '2671251' (1 和 0 都被移除)
解析:第 4 行 '10' 視為字元集合 {'1','0'},故前導所有 1 和 0 全被剝離。
SELECT RTRIM('wfrqqww', 'qq') FROM dual; -- 'wfr' (移除右側所有 w 和 q)
INSTR(string1, string2, [start_position], [nth_appearance])
INSTR('syranmo', 's') → 1
INSTR('syranmo', 'ra') → 3
INSTR('syran mo', 'a', 1, 2) → 0 (只有 1 個 'a')
INSTR('syran mo', 'a', -1, 1) → 6 (從右往左找第一個 'a')
SUBSTR(string, start_position, [length])
SUBSTR('Hello World', 1, 1) → 'H'
SUBSTR('Hello World', 0, 1) → 'H' (0 視同 1)
SUBSTR('Hello World', 2, 4) → 'ello'
SUBSTR('Hello World', -3, 3) → 'rld' (倒數第 3 字元起取 3 個)
SUBSTR('Hello World', -5) → 'World'
| 需求 | 組合寫法 |
|---|---|
| 去除首尾空格 | TRIM(col) 或 LTRIM(RTRIM(col)) |
| 取逗號前內容 | SUBSTR(col, 1, INSTR(col, ',')-1) |
| 取最後一段(以 / 分隔) | SUBSTR(col, INSTR(col, '/', -1)+1) |
| 固定寬度靠右補零 | LPAD(TO_CHAR(num), 10, '0') |
| 手機號碼遮罩 | RPAD(SUBSTR(phone,1,3), LENGTH(phone), '*') |
熟練掌握這些函數的參數語義與邊界行為(特別是 LTRIM/RTRIM 的字元集合邏輯、INSTR 的負數定位、SUBSTR 的 0/1 等價性),能讓字串處理邏輯更簡潔、更健壯。