选择子字符串直到SQL中的第二个下划线
我有这样的字符串:选择子字符串直到SQL中的第二个下划线,sql,sql-server,Sql,Sql Server,我有这样的字符串: FOO_BAR_3423423_dsadsa.doc BAZ_BAZzz_dsadsa.nox 如果\uu的数字可能不同,但我需要选择always up直到第二个\u: FOO_BAR BAZzz_BAZ SUBSTRING ([COLUMN], 0, CHARINDEX('/', [COLUMN], 0)) 我可以选择,直到第一个\uu: FOO_BAR BAZzz_BAZ SUBSTRING ([COLUMN], 0, CHARINDEX('/', [COLUMN
FOO_BAR_3423423_dsadsa.doc
BAZ_BAZzz_dsadsa.nox
如果\uu
的数字可能不同,但我需要选择always up直到第二个\u
:
FOO_BAR
BAZzz_BAZ
SUBSTRING ([COLUMN], 0, CHARINDEX('/', [COLUMN], 0))
我可以选择,直到第一个\uu
:
FOO_BAR
BAZzz_BAZ
SUBSTRING ([COLUMN], 0, CHARINDEX('/', [COLUMN], 0))
但是如何将其扩展到第二个下划线?类似于:
SUBSTRING ([COLUMN], 0, CHARINDEX('/', [COLUMN], CHARINDEX('/', [COLUMN], 0) + 1))
但是,如果少于两个,这将不起作用。您可以使用
交叉应用
以下查询将为您提供包含数据的索引
declare @T table
(
Name_Level varchar(25)
)
insert into @T values
('FOO_BAR_3423423_dsadsa'),
('BAZ_BAZzz_dsadsa'),
select SUBSTRING(Name_Level,0,p2.pos) As Data,p1.Pos as firstOccurance,p2.pos As secondOccurance
from @T
cross apply (select (charindex('_', Name_Level))) as P1(Pos)
cross apply (select (charindex('_', Name_Level, P1.Pos+1))) as P2(Pos)
结果:
-------------------------
FOO_BAR 4 8
BAZ_BAZzz 4 10
如果您想获得下一个索引,只需再添加一个
CrossApply
,它将为您提供\uu
的下一个索引使用while循环
。试试这个
DECLARE @str VARCHAR(5000)='FOO_BAR_3423423_dsadsa.doc',
@temp INT=1,
@cnt INT=0,
@result VARCHAR(5000)='',
@intr VARCHAR(50)=''
WHILE @temp <= Len(@str)
BEGIN
SELECT @intr = Substring(@str, @temp, 1)
SET @cnt += (SELECT CASE WHEN @intr = '_' THEN 1 ELSE 0 END)
SET @result+=@intr
IF @cnt = 2
BREAK
SET @temp+=1
END
SELECT SELECT left(@result ,len(@result)-1)
DECLARE@str VARCHAR(5000)='FOO_BAR_3423423_dsadsa.doc',
@温度INT=1,
@cnt INT=0,
@结果VARCHAR(5000)='',
@intr VARCHAR(50)=”
而@temp