SQL查询实现:筛选指定列中目标值至少出现指定次数的数据行
解决SQL多列至少N列满足条件的问题
嘿,这个问题其实可以用计数求和的思路来解决,比枚举所有两两组合要简洁得多,尤其适合列数较多的场景。
核心思路
把每一列是否包含目标字符(这里是'h')转换成数值:满足条件记为1,不满足记为0,然后把这些数值相加,只要总和大于等于2,就说明至少有2列符合要求。
通用SQL写法(适用于所有数据库)
这个写法不管你用MySQL、PostgreSQL、SQL Server还是Oracle都能跑:
SELECT * FROM GreetingsAndFarewell WHERE (CASE WHEN greeting1 LIKE '%h%' THEN 1 ELSE 0 END) + (CASE WHEN greeting2 LIKE '%h%' THEN 1 ELSE 0 END) + (CASE WHEN greeting3 LIKE '%h%' THEN 1 ELSE 0 END) >= 2;
简化写法(针对部分数据库)
如果你的数据库支持将布尔值直接转换为整数(比如MySQL、PostgreSQL),可以用更简洁的版本:
-- MySQL / PostgreSQL 适用 SELECT * FROM GreetingsAndFarewell WHERE (greeting1 LIKE '%h%') + (greeting2 LIKE '%h%') + (greeting3 LIKE '%h%') >= 2;
这里数据库会自动把LIKE返回的布尔结果(TRUE/FALSE)转换成1/0,直接相加即可。
为什么这个方法更好?
对比枚举所有两两组合的写法(比如(greeting1 LIKE '%h%' AND greeting2 LIKE '%h%') OR (greeting1 LIKE '%h%' AND greeting3 LIKE '%h%') OR (greeting2 LIKE '%h%' AND greeting3 LIKE '%h%')),计数求和的方式:
- 代码更简洁,可读性更高
- 扩展性更强:如果以后需要判断至少3列满足,只需要把
>=2改成>=3就行,不用新增一堆条件
用这个语句跑你的样本数据,正好能得到你期望的那3行结果~
内容的提问来源于stack exchange,提问作者radiomime
相关产品推荐
相关产品推荐

