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列留空.
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)