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

SQL Server SUBSTRING 函數完整解析:語法、負數起始位置行為、實戰範例與效能提示

     編輯:關於SqlServer

語法定義


SUBSTRING ( expression, start, length )
參數資料型別說明
expression字串/二進位型別來源運算式:欄位、變數、字串常值、純量函數回傳值。**不可含聚合函數**。
startINT**1-based** 起始位置。1=第一個字元。0 或負數視為「虛擬位置」,見下表行為。
lengthINT擷取長度 (字元/位元組數)。超出實際長度不報錯,回傳至字串結尾。

起始位置特殊值行為對照表

測試字串 'ABCDEFGHIJ' (長度 10):

startlength結果解釋
13ABC正常:第 1 字元起取 3 碼
03AB從位置 0 起算:位置 0→虛擬, 1→A, 2→B → 取 2 碼
-13A位置 -1→虛擬, 0→虛擬, 1→A → 取 1 碼
-23(空字串)位置 -2,-1,0 皆為虛擬,第 1 字元在相對位置 3,length=3 尚未到達
-93(空字串)同理,實際字元起始相對位置 > length
核心規則:SUBSTRING 在**邏輯座標軸**上從 start 向右量取 length。字串實際內容佔據座標 1 到 L。start ≤ 0 時,有效擷取區間為 MAX(1, start) ... start+length-1 與 1 ... L 的交集。

實戰範例

1. 固定格式擷取:身分證字號去驗證碼


SELECT SUBSTRING(IdNo, 1, 9) AS BaseNo FROM Customers;  -- A12345678

2. 動態長度:逗號分隔欄位取第一段


SELECT SUBSTRING(Data, 1, CHARINDEX(',', Data + ',') - 1) AS FirstPart FROM RawData;

3. 反向擷取:取最後 N 字元 (配合 LEN)


SELECT SUBSTRING(Col, LEN(Col) - 3 + 1, 4) AS Last4 FROM Table1;
-- 或 SQL 2012+ RIGHT(Col, 4)

4. 二進位資料擷取


SELECT SUBSTRING(ImageData, 1, 4) AS HeaderBytes FROM Images;  -- 讀取檔案頭

常見錯誤與避坑

錯誤原因修正
SUBSTRING(col, 0, 5) 期望取前 5 碼start=0 只取前 4 碼用 start=1
SUBSTRING(col, -5, 10) 期望倒數負數非倒數索引用 SUBSTRING(col, LEN(col)-5+1, 5) 或 RIGHT(col, 5)
對 text/ntext/image 直接用 SUBSTRING舊型別需 TEXTPTR + READTEXT改用 varchar(max)/varbinary(max) 直接支援
聚合內用 SUBSTRING參數不可含聚合函數先聚合再擷取,或用 CTE 分層

效能提示

  1. SARGable:WHERE SUBSTRING(col, 1, 3) = 'ABC' **無法使用索引** (函數在欄位上)。改用 WHERE col LIKE 'ABC%' 或計算欄位+索引。
  2. 大量資料擷取:投影欄位時僅擷取所需長度,減少網路傳輸:SELECT SUBSTRING(BigCol, 1, 100) AS Preview FROM BigTable。
  3. 二進位擷取:varbinary(max) 同樣支援,單位為**位元組**而非字元。

相關函數快查

函數用途備註
LEFT(str, n)取左 n 字元等同 SUBSTRING(str, 1, n)
RIGHT(str, n)取右 n 字元SQL 2012+
CHARINDEX(sub, str)尋找子字串位置配合 SUBSTRING 動態擷取
PATINDEX(pattern, str)萬用字元尋找支援 %[0-9]% 等模式
STUFF(str, start, len, repl)刪除+插入字串修改利器
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved