萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL Server 字串截取實戰:LEFT/CHARINDEX/STUFF/REVERSE 多段路徑解析

路徑字串 'F:\photo\Winter Leaves.jpg' 需分段擷取:磁碟、資料夾、檔名。使用 LEFT、CHARINDEX、STUFF、REVERSE 組合完成,**欄位不能為 TEXT 類型** (大物件類型不支援這些函數)。

範例資料

DECLARE @A VARCHAR(200) = 'F:\photo\Winter Leaves.jpg';

1. 擷取第一段 (磁碟代號)

SELECT LEFT(@A, CHARINDEX('\', @A) - 1);  -- 結果: F:

2. 擷取中間段 (資料夾名)

-- 先移除第一段含分隔符,再取下一個分隔符前的內容
SELECT LEFT(
           STUFF(@A, 1, CHARINDEX('\', @A), ''),
           CHARINDEX('\', STUFF(@A, 1, CHARINDEX('\', @A), '')) - 1
       );  -- 結果: photo

3. 擷取最後一段 (檔名)

-- 反轉字串,取第一個分隔符前的內容,再反轉回來
SELECT REVERSE(
           LEFT(
               REVERSE(@A),
               CHARINDEX('\', REVERSE(@A)) - 1
           )
       );  -- 結果: Winter Leaves.jpg

4. 移除首字元

SELECT STUFF(@A, 1, 1, '');  -- 結果: :\photo\Winter Leaves.jpg

函數說明表

函數語法用途
LEFTLEFT(str, len)取左側 len 字元
CHARINDEXCHARINDEX(sub, str [, start])尋找子字串位置 (1-based)
STUFFSTUFF(str, start, len, replacement)刪除 start 起 len 字元並插入 replacement
REVERSEREVERSE(str)字串反轉

現代寫法 (SQL Server 2016+ STRING_SPLIT / 2022 STRING_SPLIT_WITH_OFFSETS)

-- 2016+ 簡單分割 (無順序保證)
SELECT value FROM STRING_SPLIT('F:\photo\Winter Leaves.jpg', '\');

-- 2022+ 保留順序與位置
SELECT value, ordinal FROM STRING_SPLIT('F:\photo\Winter Leaves.jpg', '\') ORDER BY ordinal;

效能建議

  • 單次查詢用上述組合函數即可
  • 大量資料解析 → 建立計算欄位持久化、或用 CLR 正則、或 ETL 階段預處理
  • 避免在 WHERE/JOIN 中對大表使用這類運算,導致掃描無法用索引
copyright © 萬盛學電腦網 all rights reserved