Sql server 基于模式的sqlserver字符串提取
我有以下格式的字符串数据:Sql server 基于模式的sqlserver字符串提取,sql-server,regex,Sql Server,Regex,我有以下格式的字符串数据: MODELNUMBER=Z12345&HELLOWORLD=WY554&GADTYPE=PLA&ID=Z-12345 /DTYPE=PLA&ID=S-10758&UN_JTT_REDIRECT=UN_JTT_IOSV 需要根据两个条件提取ID 在模式&ID= 直到最后一个字符或结束 如果它碰到一个&就停在那里 因此,在上面的示例中,我使用以下代码: SUBSTRING(MyCol,(PATINDEX(“%&id=”,[MyCo
MODELNUMBER=Z12345&HELLOWORLD=WY554&GADTYPE=PLA&ID=Z-12345
/DTYPE=PLA&ID=S-10758&UN_JTT_REDIRECT=UN_JTT_IOSV
需要根据两个条件提取ID
&ID=
&
就停在那里SUBSTRING(MyCol,(PATINDEX(“%&id=”,[MyCol])+4),(LEN(MyCol)-PATINDEX(“%&id%,[MyCol]))
基本上是查看模式&id=%s,然后提取字符串,直到行尾。有谁能就如何处理逻辑的后面部分提出建议吗
我目前的结果是
Z-12345
Z-12345&UN_JTT_REDIRECT=UN_JTT_IOSV
我需要的是
Z-12345
Z-12345
下面是一个如何执行此操作的示例:
select
substring(d.data, s.s, isnull(nullif(e.e,0),2000)-s.s) as ID,
d.data
from data d
cross apply (
select charindex('&ID=', d.data)+4 as s
) s
cross apply (
select charindex('&', d.data, s) as e
) e
where s.s > 4
这假设那里的数据列是varchar(2000),where子句省略了没有&ID的任何行=
第一个交叉应用搜索起始位置,第二个交叉应用搜索结束位置。实际select中的isnull+nulliff处理未找到&的情况,并将其替换为2000,以确保返回整个字符串 试试这个
SUBSTRING(MyCol, (PATINDEX('%[A-Z]-[0-9][0-9][0-9][0-9][0-9]%',[MyCol])),7)
如果遇到性能问题,请添加下面的where子句
-- from Mytable
WHERE [MyCol] like '%[A-Z]-[0-9][0-9][0-9][0-9][0-9]%'
也许不是最优雅的解决方案,但它对我很有效
此
S-15229
是否始终为7个字符我想添加一条警告,以防PATINDEX找不到模式,它默认为0,这可能会导致提取不需要的字符串。