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

时间:2019-05-14 20:52:26

标签: sql sql-server

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

Col1
---------
test\abcd\123\
test\abc\
test\abc\12\
test\abcdefg\1234\

我想修剪字符串,以便得到:abcdabc(两个反斜杠之间的中间部分)

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

SELECT SUBSTRING(col1, CHARINDEX('\',col1) + 1, CHARINDEX('\',col1,CHARINDEX('\',col1)) + 1)

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

1 个答案:

答案 0 :(得分:2)

您可以将第一个和第二个反斜杠之间的字符串提取为

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

Demo

编辑(相对于使用少于两个反斜杠的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

显示所有行,将所有行保留为破坏规则。