首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 字串函數完整速查手冊:轉換、去空格、子字串、比較、操作、型別轉換、日期時間

     編輯:關於SqlServer

前言:只能在 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 的刪除+插入雙重功能**。建議將本文加入書籤,遇到字串處理需求時快速查閱對應函數與範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved