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

PostgreSQL SELECT WHERE查询如何过滤指定值同时保留null记录

原因说明

SQL采用三值逻辑(TRUE/FALSE/UNKNOWN),NULL和任意值执行=、!=等比较运算时,返回结果都是UNKNOWN。WHERE子句仅会保留判断结果为TRUE的记录,因此你添加customer_id != 21的条件时,customer_id为NULL的行判断结果为UNKNOWN,会被一并过滤。

解决方案

写法1:全数据库兼容的显式判断

直接在条件中显式允许customer_id为NULL的情况,这是兼容性最好、可读性最高的写法:

SELECT gateway, customer_id
FROM gateways
WHERE gateway = '1000056'
  AND (customer_id != 21 OR customer_id IS NULL);

写法2:标准语法简化写法

如果你使用的数据库支持SQL标准的IS NOT DISTINCT FROM运算符(PostgreSQL、SQL Server 2022+、MySQL 8.0.13+等均支持),可以用更简洁的写法,该运算符会将NULL视为普通值参与比较:

SELECT gateway, customer_id
FROM gateways
WHERE gateway = '1000056'
  AND NOT (customer_id IS NOT DISTINCT FROM 21);

不推荐写法:使用COALESCE函数

你也可以用COALESCE函数将NULL替换为一个不会和业务值冲突的默认值再做比较:

SELECT gateway, customer_id
FROM gateways
WHERE gateway = '1000056'
  AND COALESCE(customer_id, 0) != 21;

注意该写法需要保证你选择的默认值(示例中为0)绝对不会出现在customer_id的合法业务值中,否则会出现误伤,因此不推荐在生产环境使用。


内容的提问来源于stack exchange,提问作者Sean McCarthy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:36:07