專案中 Info 資料表的 Educational 欄位原儲存 JSON 陣列格式(如 [\"Bachelor\",\"Master\"]),因需求變更需改為純 JSON 字串(\"Bachelor,Master\")。資料量達百萬筆,手工修改不現實,REPLACE 函數 成為最佳解法。
REPLACE ( string_expression, string_pattern, string_replacement )
| 參數 | 說明 | 資料型別支援 |
|---|---|---|
| string_expression | 被搜尋的原始字串運算式 | char, varchar, nchar, nvarchar, binary, varbinary |
| string_pattern | 欲尋找並取代的子字串 | 同上,不可為空字串 |
| string_replacement | 取代用的字串 | 同上 |
回傳型別:若輸入為字元型別回傳字元;若為二進位型別回傳二進位。隱含轉換遵循資料型別優先順序。
-- 將 'abcdefghicde' 中所有 'cde' 替換為 'xxx'
SELECT REPLACE('abcdefghicde', 'cde', 'xxx');
-- 結果:abxxxfghixxx
需同時移除 [ 與 ] 字元:
UPDATE [Info]
SET [Educational] = REPLACE(REPLACE([Educational], '[', ''), ']', '');
[,外層再移除 ]。UPDATE Customer
SET Phone = REPLACE(REPLACE(REPLACE(Phone, '-', ''), '(', ''), ')', '');
-- 將 (02)-1234-5676 → 0212345676
SELECT REPLACE(REPLACE(Content, '', ''), '
', '') FROM Articles;
DECLARE @tpl VARCHAR(MAX) = '親愛的 {UserName},您的訂單 {OrderNo} 已出貨。';
SELECT REPLACE(REPLACE(@tpl, '{UserName}', '王小明'), '{OrderNo}', '20240501001');
TOP 子句更新,避免長時間鎖表。WHERE REPLACE(col, 'a', 'b') = 'xxx' 導致掃描,若頻繁查詢請考慮計算欄位或全文檢索。varbinary(max) 同樣支援,但需確保 pattern/replacement 為同型別。ISNULL/COALESCE 預處理。| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| REPLACE | 單一/固定字串取代 | 語法簡單、無需額外物件 | 不支援正則、巢狀層多難維護 |
| TRANSLATE (SQL 2017+) | 單字元一對一映射 | 單次呼叫完成多字元對應 | 無法處理多字元模式 |
| CLR 正則函數 | 複雜模式比對/取代 | 功能最強大 | 需啟用 CLR、部署較複雜 |
REPLACE 是 T-SQL 字串清洗的基石工具,配合巢狀呼叫可解決 90% 以上的格式轉換需求。記住:**大量寫入請分批、查詢條件勿用於索引欄位、複雜模式改用 CLR 正則**。