我有以下查询:
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/