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,这可能会导致提取不需要的字符串。