PostgreSQL不等值条件查询时如何获取所有符合要求的行
你遇到的这个现象是SQL三值逻辑的典型表现:任何和NULL的等值、不等值比较结果都不是TRUE也不是FALSE,而是UNKNOWN,WHERE子句只会保留判断结果为TRUE的行,所以name为NULL的行自然就被过滤掉了。
以下是几种可行的查询调整方案:
- 方案1:显式补充NULL判断,最通用、兼容所有SQL数据库的写法:
select * from fruits where name <> 'Ananas' OR name IS NULL;
- 方案2:用PostgreSQL原生支持的
IS DISTINCT FROM运算符,专门处理带NULL的等值比较,写法更简洁:
select * from fruits where name IS DISTINCT FROM 'Ananas';
这个运算符会将NULL视作可比较的有效值,NULL IS DISTINCT FROM 'Ananas'的返回结果直接是TRUE,不需要额外加NULL判断。
- 方案3:用
COALESCE函数对NULL做替换后再比较,适合需要统一处理缺省值的场景:
select * from fruits where COALESCE(name, '') <> 'Ananas';
注意这个方案的前提是你替换的缺省值(这里用的是空字符串)不会和你要排除的值重合,否则会出现误判。
内容的提问来源于stack exchange,提问作者I am not Fat
相关产品推荐
相关产品推荐

