PostgreSQL的括号规则,有没有总结指南?

Pet*_*uss 5 sql postgresql syntax any semantics

在数学和许多编程语言(我认为标准 SQL也是如此)中,括号改变优先级(将首先评估的部分分组)或提高可读性(对于人眼)。
等效示例:

SELECT array[1,2] @> array[1]
SELECT (array[1,2]) @> array[1]

SELECT array[1,2] @> (array[1])
SELECT ((array[1,2]) @> (array[1]))
Run Code Online (Sandbox Code Playgroud)

但是 SELECT 1 = ANY array[1,2]是语法错误(!),并且SELECT 1 = ANY (array[1,2])是有效的。为什么?

好的,因为“手册是这么说的”。但是人类记住所有异常的逻辑是什么?
有关于它的指南吗?

我不明白为什么在某些情况下(expression)是一样的expression,但在其他情况下却不是。


PS1:括号也用作值列表分隔符,如expression IN (value [, ...]). 但是数组不是值列表,当(array expression)array expression.
另外,我以数组为例,但这个问题/问题不仅与数组有关。

Pet*_*uss 7

“有总结指南吗?” ,嗯...答案是否定的,所以:动手吧!这个答案是一个维基,让我们写。

总结指南

让,

  • F () 一个通常的函数。(例如ROUND
  • L () 类函数运算符(例如ANY
  • f类似运算符的函数(例如current_date
  • 操作
  • Op1Op2是不同的运算符
  • A、B、C 值或表达式
  • S 表达式列表,如“(A,B,C)”

使用这些元素的规则的形式是

  • 规则:笔记。

“纯”数学表达式

OpOp1Op2是数学运算符(例如+, -. *),而F () 是数学函数(例如ROUND())时。

对于规则的标量表达式和“数组表达式”:

  • A Op B = (A Op B):括号是可选的。
  • A Op1 B Op2 C:需要检查优先级
  • (A Op1 B) Op2 C : 强制执行“第一 (A Op1 B)”。
  • A Op1 (B Op2 C):强制执行“第一 (B Op2 C)”。
  • F (A) = ( F (A)) = F ((A)) = ( F ((A))):括号是可选的。
  • S = (S):外括号是可选的。
  • f =( f ):括号是可选的。

带有类函数运算符的表达式

规则运营商ALLANYROWSOME,等。

  • L (A) = L ((A)):参数中的括号是可选的。
  • ( L (A)):语法错误。

...更多规则?请帮助编辑这里。


Erw*_*ter 3

ANY是一个类似函数的构造。与(几乎)Postgres 中的任何其他函数一样,它的参数周围需要括号。使语法一致并帮助解析器避免歧义。

您可以将其视为浓缩为单个表达式的ANY()简写。unnest()

人们可能会争论在的集合变体ANY周围添加一组额外的括号。但这是不明确的,因为括号中的值列表被解释为单一ROW类型

  • 在正确的上下文中,括号也可以是[行构造函数](http://www.postgresql.org/docs/current/static/sql-expressions.html#SQL-SYNTAX-ROW-CONSTRUCTORS)。因此“SELECT (表达式列表)...”相当于“SELECT ROW(表达式列表)...”。 (4认同)