如何在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