SQL中NULL与非NULL值比较异常:查询未返回全部预期行
问题解决:SQL查询未返回含NULL的行
根因分析
在SQL中,NULL代表未知值,任何与NULL的比较(如!=或=)都不会返回TRUE或FALSE,而是返回NULL。而WHERE子句只会保留结果为TRUE的行,因此包含NULL的行被过滤掉了。这就是为什么你的查询只返回了B1/C1.那一行。
另外,你的原始查询存在语法错误:列名包含空格时,需要用双引号(")或反引号(`,取决于数据库)包裹,否则数据库会将Column和A视为两个独立的标识符。
解决方案
方案1:显式处理NULL情况
修改WHERE子句,把其中一列或两列为NULL且另一列非NULL的情况也包含进来:
SELECT "Column A", "Column B" FROM table WHERE ("Column A" != "Column B") OR ("Column A" IS NOT NULL AND "Column B" IS NULL) OR ("Column A" IS NULL AND "Column B" IS NOT NULL);
方案2:使用IS DISTINCT FROM运算符(部分数据库支持)
如果你的数据库支持ANSI SQL的IS DISTINCT FROM(比如PostgreSQL、SQL Server 2022+、MySQL 8.0.17+等),可以直接用这个运算符,它会把NULL当作普通值处理,自动识别NULL与非NULL的差异:
SELECT "Column A", "Column B" FROM table WHERE "Column A" IS DISTINCT FROM "Column B";
这两种方案都能返回你预期的两行结果。
内容的提问来源于stack exchange,提问作者PHegde
相关产品推荐
相关产品推荐

