PostgreSQL中EXISTS、空结果与NULL的差异及变量赋值疑问
空结果集与NULL的区别及赋值行为解析
核心概念区分
- 空结果集:查询未匹配到任何数据,返回的是一个包含0行的结果集合,不存在任何具体的字段值。比如
select 1 from public.Test where id = 0,因为Test表只有正ID,无匹配行,所以返回空结果集。 - NULL:SQL中的特殊标量值,代表“未知/不存在的单个值”,是单个字段或变量可以持有的具体状态。
对EXISTS子句的影响
EXISTS的逻辑是仅检查子查询是否返回至少一行数据,完全不关心行内的值是什么:
- 当子查询返回空结果集(0行)时,EXISTS判定为
false,所以select case when exists(...) then 'exist' else 'not exist' end返回not exist。 - 子查询
select null会返回1行(该行的字段值为NULL),EXISTS检测到有行存在,判定为true,因此返回exist。
空结果集赋值为NULL的原因
在PL/pgSQL中,使用标量赋值语法(变量 := (子查询))时,PostgreSQL会按以下规则处理:
- 如果子查询返回1行,就将该行对应字段的值赋值给变量。
- 如果子查询返回0行,没有可提取的单个值,PostgreSQL会用NULL来表示“无值可取”的状态,因此变量被设置为NULL。
- 如果子查询返回多行,会直接抛出错误,因为标量变量无法接收多个值。
内容的提问来源于stack exchange,提问作者e1s
相关产品推荐
相关产品推荐

