【问题标题】:SQL Server String extract based on pattern基于模式的 SQL Server 字符串提取
【发布时间】:2015-02-04 00:24:52
【问题描述】:

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

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. 如果遇到& 就停在那里。

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

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

【问题讨论】:

  • 这个S-15229 是否总是7 个字符
  • “我需要的是”部分中的第二行是否应=“S-10758”?目前两条线的值相同“Z-12345”。

标签: sql-server regex


【解决方案1】:

试试这个

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

【讨论】:

  • 我想补充一点,以防 PATINDEX 找不到该模式,它默认为 0,这可能会导致提取不需要的字符串。
【解决方案2】:

下面是一个例子:

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 以确保返回整个字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 2022-01-12
    • 2012-08-13
    • 2019-08-06
    • 2017-12-10
    • 2019-12-17
    • 2022-11-30
    • 1970-01-01
    相关资源
    最近更新 更多