You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

逐个语句解析

  1. 语句select not null = null not;
    实际解析为:NOT ( NULL = (NOT NULL) )

    • 先计算右侧的NOT NULL,结果为NULL
    • 再执行NULL = NULL,结果为NULL
    • 最后对该结果执行NOT运算,结果仍为NULL(对应输出中的空行)
  2. 语句select not null = not null not;
    实际解析为:NOT ( (NOT NULL) = (NOT NULL) )

    • 两个NOT NULL的结果都是NULL
    • 执行NULL = NULL得到NULL
    • 最后NOT NULL得到NULL
  3. 语句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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:26:24