| 維度 | TRANSLATE | REPLACE |
|---|---|---|
| 替換單位 | 單一字元 (1:1 映射) | 子字串 (整體匹配) |
| 參數結構 | TRANSLATE(str, from_chars, to_chars) | REPLACE(str, search_str, replace_str) |
| 長度不等處理 | from 比 to 長 → 多餘字元**刪除** | 無長度對應概念 |
| NULL 語意 | 任一參數為 NULL → 回傳 NULL | search_str 為 NULL → 回傳 NULL;replace_str 為 NULL → 刪除匹配段 |
| 支援資料庫 | Oracle、PostgreSQL、SQL Server 2017+ | 所有主流 RDBMS |
-- 將 'abcdefga' 中 a→w, b→o, c→刪除 (因 to_chars 無對應)
SELECT TRANSLATE('abcdefga', 'abc', 'wo') FROM dual;
-- 結果: 'wodefgw'
-- 實務:清洗電話號碼,只保留數字
DELETE FROM phones
WHERE LENGTH(TRANSLATE(TRIM(phone), '0123456789' || phone, '0123456789')) <> LENGTH(TRIM(phone));
TRANSLATE(phone, '0123456789'||phone, '0123456789') → 保留數字、刪除非數字。-- 子字串整體替換
SELECT REPLACE('fgsgswsgs', 'sg', 'eeerrrttt') FROM dual;
-- 結果: 'fgeeerrrtttsweeerrrttts'
-- 無匹配則原樣回傳
SELECT REPLACE('fgsgswsgs', 'fk', 'j') FROM dual;
-- 結果: 'fgsgswsgs'
TRANSLATE,可用 REPLACE 串聯或 CLR 實現字元級映射。CREATE FUNCTION dbo.Translate (@str NVARCHAR(MAX), @from NVARCHAR(100), @to NVARCHAR(100))
RETURNS NVARCHAR(MAX)
AS BEGIN
DECLARE @i INT = 1, @len INT = LEN(@from), @ch NCHAR(1), @map NVARCHAR(2) = @to;
WHILE @i <= @len
BEGIN
SET @ch = SUBSTRING(@from, @i, 1);
SET @map = CASE WHEN @i <= LEN(@to) THEN SUBSTRING(@to, @i, 1) ELSE N'' END;
SET @str = REPLACE(@str, @ch, @map);
SET @i += 1;
END
RETURN @str;
END;
TRANSLATE = 字元級「翻譯表」,REPLACE = 字串級「搜尋替換」。記住「單字元映射找 TRANSLATE,子字串整體換 REPLACE」,即可精準選擇工具。