PATINDEX和SUBSTRING函数未返回正确值的技术问询
解决SQL提取3C开头10位字符串时无匹配留空的问题
我清楚你的困扰——当前查询在Service Item Value列没有匹配到以3C开头的10位字符串时,会错误截取前10个字符,而不是返回空值。这是因为PATINDEX找不到匹配模式时会返回0,但SQL Server里SUBSTRING的起始位置为0时会被当作1处理,所以会默认从字符串开头截取10位。
修改后的查询
SELECT [Service Item Value], CASE WHEN PATINDEX('%3C[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%', [Service Item Value]) > 0 THEN SUBSTRING( [Service Item Value], PATINDEX('%3C[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%', [Service Item Value]), 10 ) ELSE '' -- 若需要返回NULL而非空字符串,替换成NULL即可 END AS [Circuit Reference] FROM [dbo].[3c_and_2c_Report_Multiple_customers];
核心逻辑说明
- 用
CASE语句做判断:只有当PATINDEX找到有效匹配(返回值大于0)时,才执行SUBSTRING提取目标字符串; - 无匹配时直接返回空字符串或
NULL,完全符合你想要的结果; - 如果你的SQL Server版本支持正则数量词(需开启相关设置),可以把模式简化为
%3C[0-9]{8}%,写法更简洁,效果和重复8次[0-9]一致。
拿你提供的示例数据测试,像38159 (Cease) & 38160 (Re-Provide)这类无匹配的行,Circuit Reference会显示为空;而包含3C00156746的行,依然能精准提取目标字符串。
内容的提问来源于stack exchange,提问作者Raul Gonzales
相关产品推荐
相关产品推荐

