T-SQL 字串操作函數分類與實戰範例
SQL Server 提供豐富的字串函數支援資料清洗、格式化、解析、搜尋等需求。本文依功能分類整理,附上效能提示與版本相容性說明。
一、字元代碼轉換
| 函數 | 語法 | 說明 | 範例 | 結果 |
| ASCII | ASCII(char_expr) | 回傳最左字元的 ASCII 碼 | ASCII('A') | 65 |
| CHAR | CHAR(int_expr) | 回傳指定 ASCII 碼的字元 (0-255) | CHAR(65) | 'A' |
| NCHAR | NCHAR(int_expr) | 回傳 Unicode 碼位字元 (0-65535) | NCHAR(0x4E2D) | N'中' |
| UNICODE | UNICODE(nchar_expr) | 回傳最左字元的 Unicode 碼位 | UNICODE(N'中') | 20013 |
二、大小寫轉換
-- 基本轉換
UPPER('Hello World') -- 'HELLO WORLD'
LOWER('Hello World') -- 'hello world'
-- 標題大小寫 (首字大寫) - 需自行實作或使用 CLR
-- 簡易版:
SELECT UPPER(LEFT(@str,1)) + LOWER(SUBSTRING(@str,2,LEN(@str)));
三、去除空白字元
| 函數 | 語法 | 說明 | 範例 |
| LTRIM | LTRIM(str) | 移除前導空白 | LTRIM(' Hello') → 'Hello' |
| RTRIM | RTRIM(str) | 移除尾隨空白 | RTRIM('Hello ') → 'Hello' |
| TRIM | TRIM([chars FROM] str) | 移除前後指定字元 (2017+) | TRIM(' Hello ') → 'Hello' TRIM('xy' FROM 'xyHelloxy') → 'Hello' |
四、子字串擷取
| 函數 | 語法 | 說明 | 範例 |
| LEFT | LEFT(str, len) | 左側起指定長度 | LEFT('ABCDEF', 3) → 'ABC' |
| RIGHT | RIGHT(str, len) | 右側起指定長度 | RIGHT('ABCDEF', 3) → 'DEF' |
| SUBSTRING | SUBSTRING(str, start, len) | 指定位置起指定長度 (1-based) | SUBSTRING('ABCDEF', 2, 3) → 'BCD' |
| STUFF | STUFF(str, start, len, new_str) | 刪除指定長度並插入新字串 | STUFF('ABCDEF', 2, 3, 'XY') → 'AXYEF' |
五、字串搜尋與定位
| 函數 | 語法 | 說明 | 範例 |
| CHARINDEX | CHARINDEX(find, str [, start]) | 尋找子字串位置,不支援萬用字元 | CHARINDEX('BC', 'ABCDEF') → 2 |
| PATINDEX | PATINDEX('%pattern%', str) | 支援萬用字元模式搜尋 | PATINDEX('%C_D%', 'ABCDEF') → 3 |
| STRING_SPLIT | STRING_SPLIT(str, separator) | 分割字串為資料列集 (2016+) | SELECT * FROM STRING_SPLIT('A,B,C', ',') |
六、字串建構與修飾
| 函數 | 語法 | 說明 | 範例 |
| QUOTENAME | QUOTENAME(str [, quote_char]) | 加上分隔符號 (預設 [],支援 '' "" () {}) | QUOTENAME('table') → '[table]' |
| REPLICATE | REPLICATE(str, count) | 重複字串指定次數 | REPLICATE('AB', 3) → 'ABABAB' |
| REVERSE | REVERSE(str) | 反轉字串順序 | REVERSE('ABC') → 'CBA' |
| SPACE | SPACE(count) | 產生指定數量空白字元 | SPACE(5) → ' ' |
| CONCAT | CONCAT(val1, val2, ...) | 串接多值,自動處理 NULL (2012+) | CONCAT('A', NULL, 'B') → 'AB' |
| CONCAT_WS | CONCAT_WS(sep, val1, val2, ...) | 指定分隔符號串接 (2017+) | CONCAT_WS(',', 'A', 'B', 'C') → 'A,B,C' |
| TRANSLATE | TRANSLATE(str, from_chars, to_chars) | 字元級對應替換 (2017+) | TRANSLATE('abc', 'abc', '123') → '123' |
七、格式化與轉換
| 函數 | 語法 | 說明 | 範例 |
| STR | STR(float, length, decimal) | 數值轉字串,固定寬度右對齊 | STR(123.45, 10, 2) → ' 123.45' |
| FORMAT | FORMAT(value, format [, culture]) | .NET 格式化,支援文化特性 (2012+) | FORMAT(1234.5, 'C', 'zh-TW') → 'NT$1,234.50' |
| CAST/CONVERT | CAST(expr AS type) / CONVERT(type, expr, style) | 型別轉換,CONVERT 支援日期格式代碼 | CONVERT(VARCHAR, GETDATE(), 120) → '2024-01-15 14:30:00' |
八、進階解析函數 (2016+)
-- JSON 路徑提取
JSON_VALUE(@json, '$.store.book[0].author') -- 純量值
JSON_QUERY(@json, '$.store.book') -- 物件/陣列片段
JSON_MODIFY(@json, '$.price', 19.99) -- 修改回傳新 JSON
-- 字串分割 (替代自訂函數)
SELECT value, ordinal FROM STRING_SPLIT('A,B,C', ',') ORDER BY ordinal;
-- ordinal 欄位需搭配 ROW_NUMBER() 或 OPENJSON 取得順序
實戰範例:常見字串處理場景
1. 移除 HTML 標籤
CREATE FUNCTION dbo.fn_StripHtml(@Html NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS BEGIN
WHILE CHARINDEX('<', @Html) > 0
BEGIN
DECLARE @Start INT = CHARINDEX('<', @Html);
DECLARE @End INT = CHARINDEX('>', @Html, @Start);
IF @End = 0 BREAK;
SET @Html = STUFF(@Html, @Start, @End - @Start + 1, '');
END
RETURN @Html;
END;
2. 解析 CSV 行 (處理引號、逗號)
-- 簡易版:假設無巢狀引號
SELECT * FROM STRING_SPLIT(REPLACE(@csv, '","', '|'), '|');
-- 完整版:使用 OPENJSON (2016+)
DECLARE @Json NVARCHAR(MAX) = '["' + REPLACE(REPLACE(@csv, '"', '""'), ',', '","') + '"]';
SELECT value FROM OPENJSON(@Json);
3. 產生固定長度代碼 (補零)
-- RIGHT 技巧
SELECT RIGHT('000000' + CAST(@Num AS VARCHAR(6)), 6); -- 6 位數補零
-- FORMAT (2012+)
SELECT FORMAT(@Num, 'D6'); -- 相同效果
4. 字串相似度比較 (簡易版)
-- Levenshtein 距離需 CLR 或自訂函數
-- 簡易 Jaccard 相似度 (字元集合交集/聯集)
-- 實際專案建議使用全文搜尋或 Azure Cognitive Services
效能優化關鍵提醒
- ✅ 避免在 WHERE/JOIN 中對欄位使用函數:
WHERE UPPER(Name) = 'JOHN' → 無法使用索引。改為 WHERE Name = 'John' COLLATE Latin1_General_CI_AI
- ✅ 大量字串串接使用 XML PATH 或 STRING_AGG (2017+):迴圈 CONCAT 效能差
- ✅ CHARINDEX 優於 PATINDEX:無萬用字元需求時
- ✅ SUBSTRING/STUFF 比 LEFT/RIGHT 靈活:但 LEFT/RIGHT 可讀性佳
- ✅ NCHAR/NVARCHAR 處理 Unicode:避免隱含轉換導致索引失效
- ✅ FORMAT 效能較差:高頻呼叫改用 CONVERT + 風格代碼
版本相容性速查表
| 函數 | 引入版本 | 備註 |
| TRIM | SQL Server 2017 (14.x) | LTRIM/RTRIM 所有版本 |
| CONCAT | SQL Server 2012 (11.x) | |
| CONCAT_WS | SQL Server 2017 | |
| TRANSLATE | SQL Server 2017 | |
| STRING_SPLIT | SQL Server 2016 | 無 ordinal 欄位,2022+ 支援 ordinal |
| STRING_AGG | SQL Server 2017 | GROUP BY 內串接 |
| FORMAT | SQL Server 2012 | 依賴 .NET CLR,效能較慢 |
| JSON_* | SQL Server 2016 | |