如何修改SQL查询提取STORE/PROTECT前子串并规避错误?
解决SQL提取关键词前子串的场景覆盖问题
修正后的SQL查询
DECLARE @TestVariable AS VARCHAR(MAX)='UNLAB ABCFG DRETFG FOO BARFOO 3990MG TABLETS, STORE AT 15-30°C.' SELECT CASE WHEN MIN_POS = 0 THEN '' ELSE SUBSTRING(clean_str, 1, MIN_POS - 1) END AS pack_description FROM ( SELECT ISNULL(@TestVariable, '') AS clean_str, MIN(CHARINDEX(keyword, UPPER(ISNULL(@TestVariable, '')))) AS MIN_POS FROM (VALUES ('STORE'), ('PROTECT')) AS Keywords(keyword) ) AS subquery
关键改进点
- NULL值处理:用
ISNULL(@TestVariable, '')将NULL转换为空字符串,避免UPPER()和CHARINDEX()因NULL值触发报错。 - 简化多关键词位置判断:通过子查询生成关键词列表,用
MIN(CHARINDEX(...))直接获取两个关键词中先出现的位置,省去原查询中复杂的CASE分支对比逻辑。 - 边界场景兼容:
- 当字符串不含任何目标关键词时,
CHARINDEX返回0,CASE分支直接返回空字符串。 - 当关键词位于字符串开头(
CHARINDEX返回1),MIN_POS - 1 = 0,SUBSTRING会返回空字符串,符合需求。
- 当字符串不含任何目标关键词时,
场景验证
- 仅含单个关键词:例如字符串为
"KEEP DRY, PROTECT FROM LIGHT",会提取"KEEP DRY, "。 - 关键词在开头:字符串为
"STORE IN COOL PLACE",返回空字符串。 - 两关键词均存在:字符串为
"SEAL TIGHT, PROTECT FROM MOISTURE, STORE AT ROOM TEMP",会提取先出现的PROTECT之前的内容"SEAL TIGHT, "。 - 字符串为NULL:返回空字符串,无报错。
内容的提问来源于stack exchange,提问作者Rahul Hendawe
相关产品推荐
相关产品推荐

