如何在SQL Server中获取字符串前后的所有内容

如何在SQL Server中获取字符串前后的所有内容,sql,sql-server,Sql,Sql Server,我的数据库中有类似的条目: Col1 --------- test\abcd\123\ test\abc\ test\abc\12\ test\abcdefg\1234\ 我想修剪字符串以便得到:abcd或abc(两个反斜杠之间的中间部分) 我尝试过这段代码,但它不起作用(剪切太多) 我只需要两个反斜杠之间的中间部分。您可以根据需要提取第一个和第二个反斜杠之间的字符串 with t(col1) as ( select 'test\abc\123\' union all selec

我的数据库中有类似的条目:

Col1
---------
test\abcd\123\
test\abc\
test\abc\12\
test\abcdefg\1234\
我想修剪字符串以便得到:
abcd
abc
(两个反斜杠之间的中间部分)

我尝试过这段代码,但它不起作用(剪切太多)


我只需要两个反斜杠之间的中间部分。

您可以根据需要提取第一个和第二个反斜杠之间的字符串

with t(col1) as
(
 select 'test\abc\123\'      union all
 select 'test\abc\'          union all
 select 'test\abc\12\'       union all    
 select 'test\abcdefg\1234\'     
) 
select SUBSTRING(
         col1,
         CHARINDEX('\',col1)+1,
         CHARINDEX('\',col1,CHARINDEX('\',col1)+1)-
         CHARINDEX('\',col1)-1
         )
  from t;

Result String
-------------
abc
abc
abc
abcdefg

编辑(针对使用少于两个反斜杠的col1值的可能性)

select SUBSTRING(
         col1,
         CHARINDEX('\',col1)+1,
         CHARINDEX('\',col1,CHARINDEX('\',col1)+1)-
         CHARINDEX('\',col1)-1
         )
  from t
 where len(col1) - len(replace(col1,'\','')) >= 2   
完全过滤掉它们

select case when len(col1) - len(replace(col1,'\','')) >= 2 then
       SUBSTRING(
         col1,
         CHARINDEX('\',col1)+1,
         CHARINDEX('\',col1,CHARINDEX('\',col1)+1)-
         CHARINDEX('\',col1)-1
         )
       else
         col1
       end
         as "Result String"           
  from t

显示所有行,保留相同的行,破坏规则。

我必须手动输入查询中的所有条目才能使其工作吗?@ChristopherBisvert绝对不是,将
t
视为您的表(将
从t
替换为
从您的表中
),并将
部分用t(col1)删除为(…)
用于您的查询。我有以下错误。。。传递给LEFT或SUBSTRING函数的长度参数无效。@ChristopherBisvert根据问题中的示例数据,没有问题,但似乎有些行的值中缺少两个反斜杠。@ChristopherBisvert您需要通过添加
where len(col1)-len(replace)来过滤这些列值(col1,'\','')>=2
到查询。
select case when len(col1) - len(replace(col1,'\','')) >= 2 then
       SUBSTRING(
         col1,
         CHARINDEX('\',col1)+1,
         CHARINDEX('\',col1,CHARINDEX('\',col1)+1)-
         CHARINDEX('\',col1)-1
         )
       else
         col1
       end
         as "Result String"           
  from t