检索两个分隔符之间的文本

Retrieve text between two delimiters

提问人:GreyFox9881 提问时间:9/22/2023 最后编辑:AbraGreyFox9881 更新时间:9/23/2023 访问量:65

问:

我的文本采用以下命名约定的格式:。我正在尝试提取块。我试图使用 and 函数,但我是 SQL 的新手,仍然不了解它们的细微差别。还想知道是否可以复制这些结果以检索 text5 块。任何见解将不胜感激。ab123_text1_text2_text3_text4_text5_.xlsx"**text4**"substringcharindex

我尝试使用以下代码来提取文本,但我收到的不是我想要的“text3”块。以下是我正在使用的代码:

SELECT 
    SUBSTRING(FILENAME,
                    CHARINDEX('_',FILENAME,CHARINDEX('_',FILENAME) + 1) +1,
                    CHARINDEX('_',FILENAME,CHARINDEX('_',FILENAME,CHARINDEX('_',FILENAME) +1)+1) -
                    CHARINDEX('_',FILENAME,CHARINDEX('_',FILENAME)+1)-1) AS 'SOMETHING'

FROM mytable

如果代码根据需要工作,我的结果应如下所示

Results Column1:
**Text4** block
sql-server 子字符串 charindex

评论

1赞 Dai 9/22/2023
您运行的是哪个版本的 SQL Server?如果您可以创建一个新的标量 UDF(如果您的版本支持,最好也可以创建标量 UDF),则可以使此任务变得容易得多。WITH INLINE = ON
0赞 GreyFox9881 9/22/2023
我正在运行旧版本的 SQL...SSMS 版本 12SSMS Version 12
1赞 Dai 9/22/2023
SSMS 不是 SQL Server 版本 - 如果运行的是 SQL Server 2012,则确实应该更新。
0赞 Jonas Metzler 9/22/2023
如何准确获取此子字符串的逻辑是什么?这总是在第 4 次和第 5 次出现之间的部分吗?_
0赞 Jonas Metzler 9/22/2023
也许是这样的事情?dbfiddle.uk/9bzCfb6y

答:

1赞 John Cappelletti 9/22/2023 #1

如果是 2016+,则可以使用一点 JSON。

如果<2016,则还有XML方法

Declare @YourTable table (SomeCol varchar(100))
Insert Into @YourTable values
 ('ab123_text1_text2_text3_text4_text5_.xlsx.')

Select A.SomeCol
     , Pos4 = JSON_VALUE(JS,'$[4]')
From  @YourTable A
Cross Apply (values ('["'+replace(string_escape([SomeCol],'json'),'_','","')+'"]') ) B(JS)

结果

SomeCol                                     Pos4
ab123_text1_text2_text3_text4_text5_.xlsx.  text4

评论

0赞 Sean Lange 9/22/2023
使用 2022 或 Azure 会更容易,您可以在其中将序号位置添加到STRING_SPLIT。select x.value from @YourTable t cross apply string_split(t.SomeCol, '_', 1) x where x.ordinal = 5
0赞 John Cappelletti 9/22/2023
@SeanLange 非常正确。一直不明白为什么在引入序数时省略了序数string_split:)
1赞 Sean Lange 9/22/2023
我完全同意。这是一个如此巨大的波动,当它被释放时,这是一个失误。