选择子字符串直到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