You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:40:14