基于模式的SQL Server字符串提取

时间:2015-02-04 00:24:53

标签: sql-server regex

我有以下格式的字符串数据:

MODELNUMBER=Z12345&HELLOWORLD=WY554&GADTYPE=PLA&ID=Z-12345
/DTYPE=PLA&ID=S-10758&UN_JTT_REDIRECT=UN_JTT_IOSV

需要根据两个条件提取ID

  1. 在模式&ID=
  2. 之后开始
  3. 结束至最后一个字符或

  4. 如果它在那里遇到&停止。

  5. 所以在上面的例子中,我使用以下代码:

    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
    

2 个答案:

答案 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]%'

也许不是最优雅的解决方案,但它对我有用。

Correct syntax of PATINDEX

答案 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替换它以确保返回整个字符串。