資料清洗常需處理尾部雜訊字元。許多開發者只知 RTRIM 移除空白,實則它支援指定字元集合,可一次清除尾部連續出現的任意字元,大幅簡化邏輯。
RTRIM(string [, trim_chars])
-- Oracle/PostgreSQL/MySQL 8.0+ 支援雙參數
-- SQL Server 僅支援單參數(移除空白),需用 REPLACE/SUBSTRING 組合
| 場景 | 資料範例 | 語法 | 結果 |
|---|---|---|---|
| 移除尾部空白 | 'abc ' | RTRIM(col) | 'abc' |
| 移除尾部特定字元 '0' | '123000' | RTRIM(col, '0') | '123' |
| 移除尾部多種字元 '0', ' ', '.' | '123.00 ' | RTRIM(col, '0 .') | '123' |
| 移除尾部字母 'abc' | 'id123abcabc' | RTRIM(col, 'abc') | 'id123' |
關鍵行為:trim_chars 視為字元集合,而非子字串。尾部只要連續屬於集合內字元,皆會被移除,直到遇到不在集合內的字元為止。
| 資料庫 | 支援雙參數 | 替代方案 |
|---|---|---|
| MySQL 8.0+ | ✅ RTRIM(str, chars) | — |
| MySQL 5.7 | ❌ | TRIM(TRAILING chars FROM str)(僅單字元) |
| PostgreSQL | ✅ | — |
| Oracle | ✅ | — |
| SQL Server | ❌ | REVERSE(SUBSTRING(REVERSE(col), PATINDEX('%[^0 ]%', REVERSE(col)), LEN(col))) |
RTRIM('a0b0', '0') → 'a0b0'(中間的 0 保留)。RTRIM(col, 'abc') 等同 RTRIM(col, 'cba')。COALESCE 或 IFNULL。UPDATE ... WHERE RTRIM(col, '0') != col 避免全表掃描鎖表。LTRIM(str, chars) -- 移除首部指定字元集合
TRIM(BOTH chars FROM str) -- 同時移除首尾
善用這三個函數的雙參數版本,能將許多原本需要正則或多層嵌套的清洗邏輯,簡化為單一可讀性極高的函數呼叫。