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

SQL Server 字符串截取函數實戰:LEFT、RIGHT、SUBSTRING、CHARINDEX、PATINDEX、REPLACE、STUFF、REVERSE 綜合應用

     編輯:關於SqlServer

字符串解析是數據清洗、ETL、日志分析高頻需求。本文系統梳理 SQL Server 核心截取函數,並針對「域名提取」、「路徑解析」、「非標準 URL 清洗」三大實戰場景給出最佳組合拳。

基礎函數速查表

函數語法用途示例結果
LEFTLEFT(str, n)左起 n 字符LEFT('https://a.com',4) → 'http'
RIGHTRIGHT(str, n)右起 n 字符RIGHT('https://a.com',11) → 'a.com'
SUBSTRINGSUBSTRING(str, start, len)任意位置定長SUBSTRING('https://a.com',8,3) → 'a.c'
CHARINDEXCHARINDEX(find, str[, start])查找子串位置(不區分大小寫)CHARINDEX('//','https://a.com') → 6
PATINDEXPATINDEX('%pattern%', str)通配符查找位置PATINDEX('%://%','https://a.com') → 5
REPLACEREPLACE(str, old, new)全量替換REPLACE('https://a.com','https://','') → 'a.com'
STUFFSTUFF(str, start, len, new)指定區間替換/刪除STUFF('https://a.com',1,7,'') → 'a.com'
REVERSEREVERSE(str)反轉字符串REVERSE('a.com') → 'moc.a'

場景一:提取域名(已知/未知前綴)

方法 1:CHARINDEX 定位 '//' 後截取

DECLARE @Url NVARCHAR(MAX) = N'https://www.jb51.net';
SELECT SUBSTRING(@Url, CHARINDEX('//', @Url) + 2, LEN(@Url));  -- www.jb51.net

方法 2:PATINDEX 通配符定位

SELECT SUBSTRING(@Url, PATINDEX('%://%', @Url) + 3, LEN(@Url));

方法 3:REPLACE 直接去除協議頭(最簡潔)

SELECT REPLACE(@Url, 'https://', '');  -- 需處理 https://、ftp:// 等多協議

方法 4:STUFF 刪除指定區間

SELECT STUFF(@Url, CHARINDEX('https://', @Url), LEN('https://'), '');

場景二:提取文件名(路徑末段)

DECLARE @Path NVARCHAR(MAX) = N'C:\Windows\System32\drivers\etc\hosts';
-- 反轉 → 找第一個 '\' 位置 → 取右側 → 再反轉(或直接 RIGHT)
SELECT RIGHT(@Path, CHARINDEX('\', REVERSE(@Path)) - 1);  -- hosts

場景三:非標準 URL 深度清洗(實戰難點)

數據樣本:https://a.com、https://a.com/a.aspx、https://www.a.com/www/a.aspx

目標:統一提取 主域名(如 a.com、www.a.com)。

核心邏輯:SUBSTRING + CHARINDEX 組合拳

DECLARE @Url NVARCHAR(MAX) = N'https://www.a.com/www/a.aspx';

-- 1. 去協議頭
DECLARE @NoProto NVARCHAR(MAX) = STUFF(@Url, 1, CHARINDEX('://', @Url) + 2, '');

-- 2. 取第一個 '/' 前的部分 = 域名+端口
DECLARE @HostPort NVARCHAR(MAX) = SUBSTRING(@NoProto, 1, 
    CASE WHEN CHARINDEX('/', @NoProto) > 0 
         THEN CHARINDEX('/', @NoProto) - 1 
         ELSE LEN(@NoProto) END);

-- 3. (可選) 去端口
DECLARE @Domain NVARCHAR(MAX) = SUBSTRING(@HostPort, 1, 
    CASE WHEN CHARINDEX(':', @HostPort) > 0 
         THEN CHARINDEX(':', @HostPort) - 1 
         ELSE LEN(@HostPort) END);

SELECT @Domain;  -- www.a.com

函數選型決策樹

  1. 固定長度前綴/後綴 → LEFT/RIGHT。
  2. 固定位置定長 → SUBSTRING。
  3. 需查找分隔符位置 → CHARINDEX (單字符) / PATINDEX (模式)。
  4. 全量替換/刪除 → REPLACE。
  5. 區間替換/刪除 → STUFF。
  6. 從右向左查找 → REVERSE + CHARINDEX。

效能提示

  • 大數據量下 CHARINDEX/PATINDEX 在計算列/索引列上可尋址,否則全表掃描。
  • 避免在 WHERE/JOIN 條件中對大列使用函數(SARGable 原則),改用計算列持久化或應用層預處理。
  • SQL Server 2016+ 可用 STRING_SPLIT、TRANSLATE 簡化部分邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved