SQL如何查询多徽章列中任意值为1的行 无需逐个指定列条件
多徽章字段筛选持有任意徽章用户的实现方案
通用快速写法(字段数量不多时)
利用任意徽章为1时总和必然大于0的特性,直接对所有徽章字段求和做判断,不用写多个OR条件:
SELECT * FROM 你的表名 WHERE (badge1 + badge2 + badge3 + ... + 所有徽章字段) > 0;
如果你的数据库支持IN运算,也可以用更直观的写法:
SELECT * FROM 你的表名 WHERE 1 IN (badge1, badge2, badge3, ..., 所有徽章字段);
字段数量极多时免手动拼接方案
不用手动逐个列字段,通过查询数据库元数据自动生成条件语句,以MySQL为例:
- 执行元数据查询获取所有徽章字段的拼接结果
SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR ' + ') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '你的表名' AND COLUMN_NAME REGEXP '^badge[0-9]+$'; -- 匹配所有badge加数字格式的字段
- 把上一步得到的拼接字符串替换到通用写法的WHERE条件中即可,全程不用手动写字段名。
不同数据库的专属简化写法
- PostgreSQL:可以用数组匹配简化判断
SELECT * FROM 你的表名 WHERE 1 = ANY (ARRAY[badge1, badge2, ..., badgen]);
- SQL Server:可以用VALUES子句做行匹配
SELECT * FROM 你的表名 t WHERE EXISTS ( SELECT 1 FROM (VALUES(t.badge1), (t.badge2), ..., (t.badgen)) v(badge) WHERE v.badge = 1 );
注意:如果徽章字段存在NULL值,需要先用
COALESCE(字段名, 0)把NULL转为0再运算,避免NULL导致运算结果异常。
内容的提问来源于stack exchange,提问作者Pew
相关产品推荐
相关产品推荐

