SQL Server中筛选列值为1个或3个分隔项的行的方法
问题根因
你的查询无法返回预期结果,核心问题有三个:
- 存在基础语法错误:SELECT子句中
Column_1和Column_2之间缺少逗号,语句本身就无法正常执行 - 匹配使用的分隔符错误:
Column_1的实际存储值以分号;作为项之间的分隔符,原查询用空格做匹配规则,和数据实际格式完全不符 - 匹配逻辑本身存在缺陷:哪怕分隔符是空格,
LIKE '% %'会匹配所有包含至少1个空格的字符串,LIKE '% % %'也无法精准识别恰好2个空格的场景,无法准确统计分隔项数量,会出现大量漏判、误判。
解决方案
统计分隔项个数不需要复杂的字符串拆分,利用分隔符计数的逻辑即可实现高性能查询:
分隔项的总个数 = 字段内部分隔符的总数量 + 1
按照你的需求:
- 1个项对应字段内分号数量为0
- 3个项对应字段内分号数量为2
分号数量可以直接通过字符串长度差计算:原字段长度减去移除所有分号后的字段长度,就是字段内包含的分号总数。
对应可直接执行的查询语句如下:
SELECT Column_1, Column_2 FROM TableName WHERE LEN(Column_1) - LEN(REPLACE(Column_1, ';', '')) = 0 OR LEN(Column_1) - LEN(REPLACE(Column_1, ';', '')) = 2
注意:如果你的字段存在不规范存储(比如首尾带有多余分号,类似
;Check;ACH;这种格式),可以先移除首尾分号再做计数,避免统计错误。SQL Server 2017及以上版本可以用如下简化写法:SELECT Column_1, Column_2 FROM TableName WHERE LEN(TRIM(';' FROM Column_1)) - LEN(REPLACE(TRIM(';' FROM Column_1), ';', '')) IN (0, 2)这里的
IN (0,2)是等价简化写法,和拆分两个OR条件的判断逻辑完全一致。
内容的提问来源于stack exchange,提问作者Desert Eagle
相关产品推荐
相关产品推荐

