在数学和许多编程语言中(我认为标准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似乎没有一般规则。
另外,我使用数组作为示例,但这个问题/问题不仅仅是数组。
答案 0 :(得分:4)
"是否有摘要指南?" ,嗯......答案是否,所以:亲自动手!这个答案是一个Wiki,让我们写一下。
让,
ROUND
)ANY
)current_date
)使用这些元素的规则采用
形式当 Op , Op1 时, Op2 是数学运算符(例如+
,-
。{{ 1}})和 F ()是一个数学函数(例如*
)。
标量表达式和" 纯数组表达式的规则":
运营商的规则为ROUND()
,ALL
,ANY
,ROW
等。
...更多规则?请帮忙编辑。
答案 1 :(得分:3)
ANY是一个类似函数的结构。就像(几乎)Postgres中的任何其他函数一样,需要围绕其参数的括号。使语法保持一致,并帮助解析器避免歧义。
您可以将ANY()
视为unnest()
缩写为单个表达式的简写。
有人可能会围绕set-variant of ANY
争论另外一组括号。但这是不明确的,因为括号中的值列表被解释为单个ROW
type。