REPLACE 是 SQL Server 中處理字串替換的核心函數,廣泛應用於數據清洗、報表格式化、敏感詞過濾、URL 重寫等場景。本文將從語法定義、參數詳解、返回特性到實戰範例全方位解析,助你精準掌握字串替換技巧。
REPLACE ( string_expression1 , string_expression2 , string_expression3 )
| 參數 | 說明 | 數據類型支援 |
|---|---|---|
string_expression1 | 被搜索的原始字串表達式 | 字符數據、二進制數據 |
string_expression2 | 待查找並替換的子字串表達式 | 字符數據、二進制數據 |
string_expression3 | 替換用的目標字串表達式 | 字符數據、二進制數據 |
關鍵特性:
string_expression1 中 所有 出現的 string_expression2,而非僅首次匹配。Chinese_PRC_CI_AS(不區分大小寫),則 'a' 能匹配 'A'。string_expression2 為空字串 '',將返回原字串 string_expression1 不變(避免無限循環)。NULL,結果即為 NULL。char、varchar、nchar、nvarchar 等),返回 nvarchar(若有 Unicode 參數)或 varchar。binary、varbinary),返回 varbinary。-- 將 'abcdefghicde' 中所有 'cde' 替換為 'xxx'
SELECT REPLACE('abcdefghicde', 'cde', 'xxx');
-- 結果: abxxxfghixxx
SELECT REPLACE(REPLACE(REPLACE(Phone, '-', ''), ' ', ''), '(', '') AS CleanPhone
FROM Customers;
WITH SensitiveWords(Word, Replacement) AS (
SELECT '機密', '***' UNION ALL SELECT '內部', '**' UNION ALL SELECT '絕密', '****'
),
RecursiveReplace AS (
SELECT Content AS Original, Content AS Current, 1 AS Level
FROM Articles
UNION ALL
SELECT r.Original,
REPLACE(r.Current, s.Word, s.Replacement),
r.Level + 1
FROM RecursiveReplace r
JOIN SensitiveWords s ON r.Level = (SELECT COUNT(*) FROM SensitiveWords WHERE Word <= s.Word)
WHERE r.Level <= (SELECT COUNT(*) FROM SensitiveWords)
)
SELECT TOP 1 Current AS FilteredContent
FROM RecursiveReplace
WHERE Original = '這是機密文件,屬於內部絕密資料'
ORDER BY Level DESC;
SELECT REPLACE(REPLACE(UrlPath, '\\', '/'), '//', '/') AS NormalizedUrl
FROM WebLogs;
DECLARE @SqlTemplate NVARCHAR(MAX) = 'SELECT * FROM {TableName} WHERE {Condition}';
DECLARE @FinalSql NVARCHAR(MAX) = REPLACE(REPLACE(@SqlTemplate, '{TableName}', 'Users'), '{Condition}', 'Age > 18');
EXEC sp_executesql @FinalSql;
REPLACE 掃描整個字串,對超大文本(如 NVARCHAR(MAX) 存儲的文檔)性能較差。TRANSLATE (SQL Server 2017+) 或 CLR 正則表達式。REPLACE 後的列,若頻繁 WHERE REPLACE(col, ...) 查詢,建議增加計算列並建立索引。REPLACE 以其簡潔語法、全域替換語義、廣泛類型支援,成為 T-SQL 字串處理的基石。掌握其大小寫敏感規則、NULL 傳播、二進制支援 等細節,並結合 STUFF、SUBSTRING、TRANSLATE 等函數組合使用,能優雅解決 90% 以上的字串替換需求。記住:參數非 NULL 校驗、超大文本分塊處理、索引替代方案 是生產級代碼的必修課。