SQL中如何简化多列不等于指定值的WHERE子句判断?
解决方案
首先要说明:你用CONCAT_WS的方法存在误判风险——如果某列的值是125、250这类包含25作为子串的数值,NOT LIKE '%25%'会错误地排除这些行,不建议使用。
下面是几种更可靠且相对简洁的实现方式:
方案1:使用NOT EXISTS结合行值构造(通用多数数据库)
把所有USERCODE列转成临时行集合,检查其中是否存在等于25的值,不存在则保留该行:
SELECT * FROM SAMPLE_TABLE t WHERE NOT EXISTS ( SELECT 1 FROM ( VALUES (t.USERCODE1), (t.USERCODE2), (t.USERCODE3), -- 依次列出剩余的USERCODE4到USERCODE40 (t.USERCODE40) ) AS cols(user_code) WHERE cols.user_code = 25 )
这种写法逻辑清晰,把需要检查的列集中在VALUES子句里,比一堆AND更易维护,且不会出现误判。
方案2:利用数组/JSON函数检查(针对特定数据库)
如果你的数据库支持数组或JSON操作,可以用更简洁的语法实现:
PostgreSQL 版本
SELECT * FROM SAMPLE_TABLE WHERE 25 <> ALL(ARRAY[USERCODE1, USERCODE2, ..., USERCODE40])
ALL运算符会检查数组中所有元素是否都不等于25,写法非常直观。
MySQL 5.7+ 版本
SELECT * FROM SAMPLE_TABLE WHERE JSON_CONTAINS(JSON_ARRAY(USERCODE1, USERCODE2, ..., USERCODE40), CAST(25 AS JSON)) = 0
通过将列打包成JSON数组,直接检查数组是否包含目标值。
方案3:简化逻辑表达式(最直接的写法)
排除“任意一列等于25”的行,等价于保留“所有列都不等于25”的行,也可以写成:
SELECT * FROM SAMPLE_TABLE WHERE NOT (USERCODE1 = 25 OR USERCODE2 = 25 OR ... OR USERCODE40 = 25)
这种写法和你最初的AND写法逻辑完全等价,但用NOT + OR的组合有时会更直观。
内容的提问来源于stack exchange,提问作者ThingyBlahBlah3
相关产品推荐
相关产品推荐

