【问题标题】:The parentheses rules of PostgreSQL, is there a summarized guide?PostgreSQL的括号规则,有没有总结指南?
【发布时间】:2014-05-10 22:21:42
【问题描述】:

在数学和许多编程语言(我认为标准 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 中似乎没有一般规则。
另外,我以数组为例,但这个问题/问题不仅仅是关于数组。

【问题讨论】:

  • 既然这是 SQL,算你自己幸运,因为你不必把它写成模拟英语短语,比如 SELECT 1 HAS ANY VALUE FROM ARRAY WITH VALUES 1 AND 2 AND 3 END ;)

标签: sql postgresql syntax semantics any


【解决方案1】:

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

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

有人可能会在set-variant of ANY 周围加上一组括号。但这将是模棱两可的,因为括号中的值列表被解释为单个 ROW type

【讨论】:

  • 在正确的上下文中,括号也可以是row constructor。所以SELECT (expression-list)... 等价于SELECT ROW(expression-list)...
  • @MikeSherrill'CatRecall':就是这么想的。 :) 添加了您提供的链接。
  • 好的,谢谢! “类似函数的构造”是有道理的! ALLANYROWSOME 都在现实生活中ALL()ANY()、@987654335 @ 和 SOME() 像往常一样的函数语法......我必须在这里用the PostgreSQL guide(!)注册我的“个人愤慨”:没有提到“函数”或“类似函数”,只有 “.. . 右侧是括号表达式 ... 左侧表达式被评估并与每个元素进行比较",没有客观的解释。
  • 不要增加你的愤慨,但甚至有少数函数没有括号(遵守SQL标准和历史原因)。喜欢current_date or current_timestamp.
【解决方案2】:

“有没有总结指南?”,嗯……答案是没有,所以:动手!这个答案是维基,我们来写吧。

总结指南

让,

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

使用这些元素的规则在表单中

  • 规则:注释。

“纯”数学表达式

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

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

  • A Op B = (A Op B):括号是可选的。
  • A Op1 B Op2 C:需要查看precedence
  • (A Op1 B) Op2 C:执行“first (A Op1 B)”。
  • A Op1 (B Op2 C):执行“first (B Op2 C)”。
  • F(A) = (F(A)) = F((A)) = (F em>((A))):括号是可选的。
  • S = (S):外括号是可选的。
  • f=(f):括号是可选的。

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

ALLANYROWSOME 等运算符的规则

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

...更多规则?请在此处帮助编辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2013-04-15
    • 2011-07-13
    • 2017-08-31
    • 2017-07-30
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多