繁体   English   中英

如何在 SQL 中具有未确定模式的字符串中的两个字符之间提取 substring

[英]How to extract a substring between two characters in a string having undetermined pattern in SQL

我已经阅读了很多讨论在两个字符之间提取 substring 的主题,但我的问题与现有问题有点不同。 我有一个这样的字符串,具有不同的模式 ''' /m/ hello end; /r/你过得怎么样; '''

我需要在 /m/ 和 end 之间分隔字符串; 在 /r/ 和 end 之间;

我使用了 substring 和 charindex 函数,它们给出了正确的 output 但并非在所有输入字符串的情况下。 我的输入字符串有太多变化。例如,它可能像''' /m/ hello /r/ 你好吗? (在 /m/ 部分没有结尾)''' 在这种情况下,如果我在 /m/ 和 end 之间提取字符串; 它将包括我不需要的 /r/ 。 如果我更改逻辑并在 /m/ 和 /r/ 之间提取,则 /r/ 可能在 /m/ 之前,例如

''' /r/ 在大流行结束期间我在家工作; /m/ 你怎么结束; /r/ before /m/) ''' 输入字符串没有确定的长度。

尝试使用 PATINDEX 但我的输入字符串没有特定模式。

我需要专家的建议。

谢谢你的帮助!

这通过将 /m/ 和 /r/ 替换为 pipe '|' 来拆分字符串然后在结果上使用 STRING_SPLIT 。

declare @string         varchar(100)=''' /m/ hello end; /r/ how are you end; ''';

select @string=replace(@string, t.v, '|')
from
  (values ('/m/'), ('/r/')) t(v);

select trim([value]) split_string from string_split(@string, '|');

更新:为了在 @string 中保留两个搜索词,它使用嵌套的 REPLACE 函数。 为了保留搜索词的外观顺序,我使用了这个拆分器。

declare @string         varchar(100)=''' /m/ hello end; /r/ how are you end; ''';

select * from dbo.DelimitedSplit8K(replace(replace(@string,'/m/', '|/m/'),'/r/', '|/r/'), '|');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM