PostgreSQL的括号规则是否有总结指南?

时间:2014-03-31 14:14:40

标签: sql postgresql syntax semantics any

在数学和许多编程语言中(我认为标准SQL ),括号change precedence(首先对要评估的部分进行分组)或增强可读性(对于人眼)。
等效例子:

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

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

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

好的,因为"the manual says so"。但人类记住所有例外的逻辑是什么? 是否有关于它的指南?

我不明白为什么(expression)在某些情况下与expression相同,但在其他情况下则不然。


PS1:括号也用作值列表分隔符,如expression IN (value [, ...])中所示。但是数组不是值列表,当(array expression)array expression不同时,PostgreSQL似乎没有一般规则。
另外,我使用数组作为示例,但这个问题/问题不仅仅是数组。

2 个答案:

答案 0 :(得分:4)

"是否有摘要指南?" ,嗯......答案是,所以:亲自动手!这个答案是一个Wiki,让我们写一下。

汇总指南

让,

  • F ()一个通常的功能。 (例如ROUND
  • L ()类似函数的运算符(例如ANY
  • f 类似于运算符的函数(例如current_date
  • 操作操作员
  • Op1 Op2 是不同的运算符
  • A,B,C值或表达式
  • 表达式列表,如"(A,B,C)"

使用这些元素的规则采用

形式
  • 规则:notes。

"纯"数学表达式

Op Op1 时, Op2 是数学运算符(例如+-。{{ 1}})和 F ()是一个数学函数(例如*)。

标量表达式和" 数组表达式的规则":

  • A 操作 B =(A 操作 B):括号是可选的。
  • A Op1 B Op2 C :需要检查precedence
  • (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 :括号是可选的。

具有类似函数的运算符的表达式

运营商的规则为ROUND()ALLANYROW等。

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

...更多规则?请帮忙编辑。

答案 1 :(得分:3)

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

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

有人可能会围绕set-variant of ANY争论另外一组括号。但这是不明确的,因为括号中的值列表被解释为单个ROW type