我有以下格式的字符串数据:
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 =%并在此之后提取字符串直到行尾。有人会建议如何处理逻辑的后期部分..
我目前的结果是
Z-12345
Z-12345&UN_JTT_REDIRECT=UN_JTT_IOSV
我需要的是
Z-12345
Z-12345
答案 0 :(得分:6)
试试这个
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]%'
也许不是最优雅的解决方案,但它对我有用。
答案 1 :(得分:3)
以下是一个如何操作的示例:
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 =
的行第一个交叉应用搜索起始位置,第二个交叉应用搜索结束。实际选择中的isnull + nulliff处理&找不到并用2000替换它以确保返回整个字符串。