如何在SQL(SSMS)中提取两个相同字符之间的值——文件路径首目录名提取方法咨询
在SSMS中提取路径第一个目录名的最优方法
嘿,这个需求挺常见的,咱直接上最实用的方案,按性能和兼容性排序:
方法一:CHARINDEX + SUBSTRING(最优,全版本兼容)
这是性能最好的方案,用的都是SQL Server原生的轻量字符串函数,不管你用哪个版本的SQL Server都能跑,大数据量下效率也很高。
核心思路是定位第一个和第二个/的位置,截取中间的内容后用TRIM清理可能的多余空格:
SELECT 原路径 = YourColumnName, 第一个目录名 = TRIM(SUBSTRING( YourColumnName, -- 第一个/的位置+1,就是目录名的起始位置 CHARINDEX('/', YourColumnName) + 1, -- 计算截取长度:第二个/的位置 - 第一个/的位置 -1 CHARINDEX('/', YourColumnName, CHARINDEX('/', YourColumnName) + 1) - CHARINDEX('/', YourColumnName) - 1 )) FROM YourTableName -- 过滤格式不符合的路径(确保至少有两个/,避免截取出错) WHERE YourColumnName LIKE '/%/%'
兼容边界情况
如果数据里存在只有一级目录的路径(比如/Example Folder/或者/Example File),可以加CASE语句兼容:
SELECT 原路径 = YourColumnName, 第一个目录名 = CASE -- 检查是否存在第二个/ WHEN CHARINDEX('/', YourColumnName, CHARINDEX('/', YourColumnName) + 1) = 0 THEN -- 没有第二个/,截取第一个/之后的所有内容 TRIM(SUBSTRING(YourColumnName, CHARINDEX('/', YourColumnName) + 1, LEN(YourColumnName) - CHARINDEX('/', YourColumnName))) ELSE TRIM(SUBSTRING( YourColumnName, CHARINDEX('/', YourColumnName) + 1, CHARINDEX('/', YourColumnName, CHARINDEX('/', YourColumnName) + 1) - CHARINDEX('/', YourColumnName) - 1 )) END FROM YourTableName WHERE YourColumnName IS NOT NULL AND YourColumnName LIKE '/%'
方法二:STRING_SPLIT(SQL Server 2022+ 可选)
如果用的是SQL Server 2022及以上版本,STRING_SPLIT新增了ordinal参数来保证拆分顺序,代码会更简洁:
SELECT 原路径 = t.YourColumnName, 第一个目录名 = TRIM(s.value) FROM YourTableName t -- 按/拆分,指定ordinal参数保留顺序 CROSS APPLY STRING_SPLIT(t.YourColumnName, '/', 1) s -- 拆分后第一个/前是空字符串,所以第一个目录是ordinal=2的项 WHERE s.ordinal = 2 AND t.YourColumnName IS NOT NULL AND t.YourColumnName LIKE '/%'
这个方案代码更易读,但性能不如第一种,且仅支持2022+版本,适合小数据量或追求代码简洁的场景。
额外提醒
- 如果路径同时存在
/和\分隔符,先统一替换:REPLACE(YourColumnName, '\', '/') - 记得处理
NULL值和格式不规范的路径,避免返回错误或空值
内容的提问来源于stack exchange,提问作者sjade
相关产品推荐
相关产品推荐

