字符串解析是數據清洗、ETL、日志分析高頻需求。本文系統梳理 SQL Server 核心截取函數,並針對「域名提取」、「路徑解析」、「非標準 URL 清洗」三大實戰場景給出最佳組合拳。
| 函數 | 語法 | 用途 | 示例結果 |
|---|---|---|---|
| LEFT | LEFT(str, n) | 左起 n 字符 | LEFT('https://a.com',4) → 'http' |
| RIGHT | RIGHT(str, n) | 右起 n 字符 | RIGHT('https://a.com',11) → 'a.com' |
| SUBSTRING | SUBSTRING(str, start, len) | 任意位置定長 | SUBSTRING('https://a.com',8,3) → 'a.c' |
| CHARINDEX | CHARINDEX(find, str[, start]) | 查找子串位置(不區分大小寫) | CHARINDEX('//','https://a.com') → 6 |
| PATINDEX | PATINDEX('%pattern%', str) | 通配符查找位置 | PATINDEX('%://%','https://a.com') → 5 |
| REPLACE | REPLACE(str, old, new) | 全量替換 | REPLACE('https://a.com','https://','') → 'a.com' |
| STUFF | STUFF(str, start, len, new) | 指定區間替換/刪除 | STUFF('https://a.com',1,7,'') → 'a.com' |
| REVERSE | REVERSE(str) | 反轉字符串 | REVERSE('a.com') → 'moc.a' |
DECLARE @Url NVARCHAR(MAX) = N'https://www.jb51.net';
SELECT SUBSTRING(@Url, CHARINDEX('//', @Url) + 2, LEN(@Url)); -- www.jb51.net
SELECT SUBSTRING(@Url, PATINDEX('%://%', @Url) + 3, LEN(@Url));
SELECT REPLACE(@Url, 'https://', ''); -- 需處理 https://、ftp:// 等多協議
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
數據樣本:https://a.com、https://a.com/a.aspx、https://www.a.com/www/a.aspx
目標:統一提取 主域名(如 a.com、www.a.com)。
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
LEFT/RIGHT。SUBSTRING。CHARINDEX (單字符) / PATINDEX (模式)。REPLACE。STUFF。REVERSE + CHARINDEX。CHARINDEX/PATINDEX 在計算列/索引列上可尋址,否則全表掃描。SARGable 原則),改用計算列持久化或應用層預處理。STRING_SPLIT、TRANSLATE 簡化部分邏輯。