SQL Server中如何移除第四个‘\’左侧的所有文本?
在SQL Server中移除字符串第四个反斜杠左侧的内容
你需要处理的字符串如下:
pw:\abcdef-uk-ldn-pw.acme.com:abcdef-uk-ldn-pw-02\Documents\_Demonstration\PROJ1_JAC\30 Project Data\A - Architecture\03 - Documents\PROJ1_JAC-JAC-XX-00-D-A-0001
目标是移除第四个\左侧的所有内容,得到:
_Demonstration\PROJ1_JAC\30 Project Data\A - Architecture\03 - Documents\PROJ1_JAC-JAC-XX-00-D-A-0001
SQL Server没有MySQL的SUBSTRING_INDEX()函数,这里提供两种可行的实现方法:
方法一:嵌套CHARINDEX定位截取(兼容所有SQL Server版本)
通过逐层定位每个反斜杠的位置,找到第四个\的位置后,截取其右侧的内容:
DECLARE @inputStr NVARCHAR(MAX) = 'pw:\\abcdef-uk-ldn-pw.acme.com:abcdef-uk-ldn-pw-02\\Documents\\_Demonstration\\PROJ1_JAC\\30 Project Data\\A - Architecture\\03 - Documents\\PROJ1_JAC-JAC-XX-00-D-A-0001'; -- 依次定位第1到第4个反斜杠的位置 DECLARE @pos1 INT = CHARINDEX('\', @inputStr); DECLARE @pos2 INT = CHARINDEX('\', @inputStr, @pos1 + 1); DECLARE @pos3 INT = CHARINDEX('\', @inputStr, @pos2 + 1); DECLARE @pos4 INT = CHARINDEX('\', @inputStr, @pos3 + 1); -- 截取第四个反斜杠右侧的内容 SELECT SUBSTRING(@inputStr, @pos4 + 1, LEN(@inputStr) - @pos4) AS Result;
也可以把定位逻辑合并成一行更简洁的写法:
DECLARE @inputStr NVARCHAR(MAX) = 'pw:\\abcdef-uk-ldn-pw.acme.com:abcdef-uk-ldn-pw-02\\Documents\\_Demonstration\\PROJ1_JAC\\30 Project Data\\A - Architecture\\03 - Documents\\PROJ1_JAC-JAC-XX-00-D-A-0001'; SELECT SUBSTRING( @inputStr, CHARINDEX('\', @inputStr, CHARINDEX('\', @inputStr, CHARINDEX('\', @inputStr, CHARINDEX('\', @inputStr) + 1 ) + 1 ) + 1 ) + 1, LEN(@inputStr) ) AS Result;
方法二:使用STRING_SPLIT+STRING_AGG(SQL Server 2016及以上)
利用字符串分割和聚合函数,跳过前3个分割项(对应前三个反斜杠分隔的内容),将剩余项重新拼接:
DECLARE @inputStr NVARCHAR(MAX) = 'pw:\\abcdef-uk-ldn-pw.acme.com:abcdef-uk-ldn-pw-02\\Documents\\_Demonstration\\PROJ1_JAC\\30 Project Data\\A - Architecture\\03 - Documents\\PROJ1_JAC-JAC-XX-00-D-A-0001'; SELECT STRING_AGG(value, '\') AS Result FROM ( SELECT value, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn FROM STRING_SPLIT(@inputStr, '\') ) AS splits WHERE rn >= 4; -- 跳过前3个分割项,从第4项开始拼接
说明
- 方法一兼容性强,适合所有SQL Server版本,逻辑直观但写法稍繁琐;
- 方法二更简洁,但依赖SQL Server 2016及以后版本的
STRING_SPLIT和STRING_AGG函数。
内容的提问来源于stack exchange,提问作者David Perrie
相关产品推荐
相关产品推荐

