PostgreSQL 16中单目‘NOT’函数的特殊语法解析疑问
多单目
NOT在PostgreSQL中的语法解析与结果说明 执行示例
mydb=# select version(); version ------------------------------------------------------------------------------------------------------------------------------- PostgreSQL 16.1 (Homebrew) mydb=# select not null = null not; not ----- (1 row) mydb=# select not null = not null not; not ----- (1 row) mydb=# select not null = not not null not; not ----- (1 row)
核心语法规则
PostgreSQL中,单目运算符NOT的优先级高于比较运算符=,且支持右结合的表达式解析。同时需注意两个关键规则:
- 对
NULL执行NOT运算,结果仍为NULL(NULL代表未知值,其否定依然是未知) - 任何包含
NULL的比较运算(如NULL = NULL),结果均为NULL
逐个语句解析
语句
select not null = null not;
实际解析为:NOT ( NULL = (NOT NULL) )- 先计算右侧的
NOT NULL,结果为NULL - 再执行
NULL = NULL,结果为NULL - 最后对该结果执行
NOT运算,结果仍为NULL(对应输出中的空行)
- 先计算右侧的
语句
select not null = not null not;
实际解析为:NOT ( (NOT NULL) = (NOT NULL) )- 两个
NOT NULL的结果都是NULL - 执行
NULL = NULL得到NULL - 最后
NOT NULL得到NULL
- 两个
语句
select not null = not not null not;
实际解析为:NOT ( (NOT NULL) = (NOT (NOT NULL)) )NOT NULL结果为NULL,嵌套的NOT (NOT NULL)等价于NOT NULL,结果也是NULL- 执行
NULL = NULL得到NULL - 最后
NOT NULL得到NULL
总结
所有语句的最终结果都是NULL,因此输出显示为空行。PostgreSQL允许这类表达式是因为它严格按照运算符优先级和结合性解析,不存在语法冲突。
内容的提问来源于stack exchange,提问作者Buzz Moschetti
相关产品推荐
相关产品推荐

