PostgreSQL中行别名is null与is not null返回值不一致问题问询
问题解析与解答
为什么整行判断会出现is null和is not null都返回false?
这是SQL标准定义的整行NULL判断逻辑导致的:
行表达式 is null:仅当该行的所有字段都为NULL时返回true,否则返回false。行表达式 is not null:仅当该行的所有字段都不为NULL时返回true,否则返回false。
从你的查询输出能看到,行数据里存在空值位置(,,"username1 username2"中间的字段),说明该行有部分字段为NULL、部分非NULL,因此两个判断都会返回false,这是符合规则的正常行为,并非数据库bug。
关于两种判断方式的疑问解答
字段级判断是通用推荐写法
业务场景中,我们通常关心特定字段的NULL状态,而非整行所有字段的状态。字段级判断(比如ui.user_id is null)语义清晰,不会产生歧义,是日常开发中更常用、更稳妥的写法。直接判断行的方式是生效的,但语义和你预期不同
整行判断本身是符合SQL标准的语法,但它的语义不是“该行是否存在数据”,而是“该行所有字段是否全为NULL/全不为NULL”。如果你的需求是判断该行是否存在(即是否有这条记录),应该用exists子查询或者直接检查主键/唯一键是否存在,而非整行的NULL判断。
内容的提问来源于stack exchange,提问作者Filip Jakab
相关产品推荐
相关产品推荐

