PATINDEX和SUBSTRING没有返回正确的值

Rau*_*les 2 sql t-sql sql-server sql-server-2008

我有以下查询:

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];
Run Code Online (Sandbox Code Playgroud)

查询应查找服务项值列中的任何字符串,并提取任何长度为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`
Run Code Online (Sandbox Code Playgroud)

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

Gra*_*tly 6

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]
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案.(但这是一个`CASE`*表达式*) (4认同)
  • 您也可以在不重复patindex表达式的情况下执行此操作.`SUBSTRING([服务项目值],COALESCE(NULLIF(PATINDEX('%[3] [C] [0-9] [0-9] [0-9] [0-9] [0-9] [0 -9] [0-9] [0-9]%',[服务项目值]),0),LEN([服务项目值])+ 1),10)` (2认同)