我有以下查询:

select [Service Item Value],
  SUBSTRING
  (
    [Service Item Value],
    PATINDEX('%[3][C][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',
      [Service Item Value]),
    10
  ) AS [Circuit Reference]
FROM [dbo].[3c_and_2c_Report_Multiple_customers];

该查询应在服务项目值列中查找任何字符串,并仅提取任何长度为10个字符且以3C开头的字符串。这样做(请参阅查询的最后结果),但是,当没有模式匹配时,它仅返回所需的任何内容
Service Item Value                     Circuit Reference
38159 (Cease) & 38160 (Re-Provide)          38159 (Ce
384K                                        384K
3925 bundle no. 1230                        3925 bund
3C00156746                                  3C00156746
P752480A,C72/217777*3C00190634,             3C00190634
P0638887A, C72/23872 * 3C00193454           3C00193454
(C72/29814 * P0647973A)>3C00231114 *        3C00231114`

基本上,如果没有模式匹配,则将Circuit Reference列留空。

最佳答案

如果没有匹配项,PATINDEX将返回0,如果第一个字符存在匹配项,则返回1 ...(第二个字符为2,以此类推)
SUBSTRING将接受0作为第二个起始参数。

因此,您基本上允许失败的PATINDEX仍然返回子字符串。

也许使用CASE表达式来捕获PATINDEX的零返回

CASE WHEN PATINDEX('%[3][C][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%', [Service Item Value]) = 0 THEN ''
ELSE
SUBSTRING([Service Item Value],PATINDEX('%[3][C][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%', [Service Item Value]),10)
END AS [Circuit Reference]

关于sql - PATINDEX和SUBSTRING没有返回正确的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48079829/

10-12 00:52
查看更多