前言:只能在 SQL 陳述式中使用的內建函數
應用程式語言的函數(如 C# IndexOf、Java substring)**不可**直接用在 T-SQL 中。必須使用對應的 SQL 內建函數,例如 CHARINDEX 替代 IndexOf。
一、字元轉換函數
| 函數 | 用途 | 範例/備註 |
ASCII(char_expr) | 回傳最左字元 ASCII 碼 | 純數字字串可不加引號,含字母必須加單引號 |
CHAR(int_expr) | ASCII 碼轉字元 (0-255) | 超出範圍回傳 NULL |
LOWER/UPPER(char_expr) | 大小寫轉換 | 不影響非字母字元 |
STR(float_expr[, len[, dec]]) | 數值轉字串 | 預設長度 10、小數 0;長度不足左補空格;長度小於整數位回傳 * |
二、去空格函數
| 函數 | 用途 |
LTRIM(char_expr) | 移除前導空格 |
RTRIM(char_expr) | 移除尾隨空格 |
TRIM([chars FROM] str) (SQL 2017+) | 移除首尾指定字元(預設空格) |
三、子字串擷取函數
| 函數 | 語法 | 說明 |
LEFT(str, len) | 左起 len 字元 | len 為負回傳 NULL |
RIGHT(str, len) | 右起 len 字元 | len 為負回傳 NULL |
SUBSTRING(str, start, len) | 從 start (1-based) 取 len 字元 | start > 長度回傳空字串;len 超過尾部截至尾 |
四、字串比較/搜尋函數
| 函數 | 語法 | 差異重點 |
CHARINDEX(sub, str[, start]) | 回傳 sub 在 str 中首次出現位置 (1-based),找不到回 0 | 不支援萬用字元;不可用於 TEXT/IMAGE |
PATINDEX('%pattern%', str) | 支援萬用字元 (% _ [範圍]) 的模式搜尋 | 模式必須包含 %;支援 CHAR/VARCHAR/TEXT |
五、字串操作函數
| 函數 | 語法/用途 | 常見用法 |
QUOTENAME(str[, quote_char]) | 用指定字元括住字串 (預設 []) | 動態 SQL 防注入:QUOTENAME(@tbl) |
REPLICATE(str, count) | 重複字串 count 次 | count < 0 回傳 NULL |
REVERSE(str) | 字元順序反轉 | 可用於反向搜尋、檢查回文 |
REPLACE(str, old, new) | 將 str 中所有 old 替換為 new | 資料清洗、敏感字過濾 |
SPACE(count) | 產生指定長度空白字串 | count < 0 回傳 NULL |
STUFF(str, start, len, new_str) | 刪除 str 從 start 長度 len,插入 new_str | 字串拼接、掩碼、格式化 |
六、資料型別轉換函數
| 函數 | 語法 | 關鍵差異 |
CAST(expr AS type[(len)]) | ANSI 標準轉換 | 可轉換為系統型別,不可用使用者自訂型別 |
CONVERT(type[(len)], expr[, style]) | SQL Server 專用,支援 style 格式化 | 日期/時間轉字串必用 CONVERT + style (如 120, 121, 103) |
轉換陷阱:
• 字串轉數值 → 字串必須為純數字格式(含正負號)
• TEXT→VARCHAR 最大 8000 字元
• IMAGE→VARBINARY 最大 8000 位元組
• 整數→MONEY 依伺服器語系格式化貨幣符號
• BIT 非零→1
• 目標長度不足 → 截斷並顯示 + 號警示
七、日期時間函數
| 函數 | 用途/語法 | 等價/備註 |
DAY/ MONTH/ YEAR(date) | 取日/月/年 (整數) | DATEPART(dd/mm/yy, date) |
DATEADD(datepart, n, date) | 日期加減 | datepart: year, quarter, month, day, week, hour, minute, second, millisecond |
DATEDIFF(datepart, start, end) | 兩日期差距 (帶正負號整數) | 跨邊界計算:DATEDIFF(day, '2023-12-31', '2024-01-01') = 1 |
DATENAME(datepart, date) | 日期部份以字串回傳 (如月份名稱) | DATENAME(month, GETDATE()) → 'January' |
DATEPART(datepart, date) | 日期部份以整數回傳 | 通用取值函數 |
GETDATE() | 目前系統日期時間 (DATETIME) | 精度 ~3.33ms;高精度用 SYSUTCDATETIME() (SQL 2008+) |
實戰常用組合技
-- 1. 移除前後空格並統一大小寫
SELECT UPPER(LTRIM(RTRIM(col))) FROM tbl;
-- 2. 取逗號前段文字
SELECT LEFT(col, CHARINDEX(',', col + ',') - 1) FROM tbl;
-- 3. 日期格式化為 yyyy-MM-dd
SELECT CONVERT(CHAR(10), GETDATE(), 120); -- 120 = yyyy-mm-dd hh:mi:ss(24h)
-- 4. 本月第一天 / 最後一天
SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0); -- 首日 00:00
SELECT DATEADD(day, -1, DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 1, 0)); -- 末日 23:59
-- 5. 字串拼接 (SQL 2017+ STRING_AGG)
SELECT STRING_AGG(name, ',') FROM sys.tables;
結語
熟練掌握這 7 大類字串/日期函數,即能在 T-SQL 中完成 90% 以上的資料清洗、格式化、比對、轉換工作。關鍵在於:**記住 CHARINDEX/PATINDEX 差異、CONVERT style 參數、SUBSTRING 1-based 起算、STUFF 的刪除+插入雙重功能**。建議將本文加入書籤,遇到字串處理需求時快速查閱對應函數與範例。