postgresql “COLLATE”运算符的优先级是什么?

fiei3ece  于 12个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(126)

COLLATE运算符的优先级是什么?例如,在以下示例中:

SELECT 'a' || 'B' COLLATE someting

字符串
我认为在这个特殊情况下,它被解释为:

SELECT 'a' || ('B' COLLATE something)


但是有没有一个关于COLLATE关键字福尔斯落在哪里的确切规则的列表?那一节是不是说“所有其他运算符”?

prdp8dxp

prdp8dxp1#

通常,PostgreSQL文档提供:
COLLATE子句比运算符绑定得更紧;必要时可以使用括号。

6yjfywim

6yjfywim2#

我发现PostgreSQL文档中关于运算符优先级的内容非常缺乏,这让人沮丧。虽然SQL语法文档中确实指出:
COLLATE子句的绑定比运算符更紧密

这是不正确的。

PostgreSQL文档将.::[]作为运算符优先级表中的运算符列出,这些运算符比COLLATE绑定得更紧,如以下表达式所示,不会导致错误:

SELECT foo.bar COLLATE "POSIX" FROM foo;
SELECT 'Hello' :: VARCHAR COLLATE "POSIX";
SELECT t.arr[1] COLLATE "C" FROM (SELECT ARRAY['Hello'] AS arr) t;

字符串
同时,“任何其他运算符”类别中的运算符绑定比COLLATE宽松。例如,我们讨论的||运算符:

SELECT 2 || 'Hello' COLLATE "C"; -- works fine
SELECT 'Hello' || 2 COLLATE "C"; -- throws error


它也比AT TIME ZONE运算符(另一个未在运算符优先级表中列出的运算符)绑定得更紧。如以下代码所示:

SELECT TIME '12:30' AT TIME ZONE 'UTC' COLLATE "C"; -- works fine
SELECT TIME '12:30' COLLATE "C"; -- throws error


我通过实验确定,AT TIME ZONE比一元+/-绑定得更紧,比求幂(^)更松。
COLLATE运算符也比一元+/-绑定得更紧:

-- throws error: collations are not supported by type double precision
SELECT +'2' COLLATE "C";

我在此提供一个修改后的PostgreSQL运算符优先级表:

  • .(表/列名分隔符)
  • ::(铸型)
  • ()函数调用
  • [](数组访问器)
  • +-(一元加,减)
    *COLLATE
    *AT TIME ZONEAT LOCAL
  • ^(求幂)
  • */%(乘法、除法、取模)
  • +-(加法、减法)
  • 任何其他运算符(例如||>>|/#~
    *ESCAPE
  • BETWEENINLIKEILIKESIMILAR
  • <>=<=>=<>!=(比较)
  • ISISNULLNOTNULLIS DISTINCT FROM
  • NOT
  • AND
  • OR
    *INTERSECT
    *UNIONEXCEPT

说明:PostgreSQL源码。

**更新:**文档的最新开发版本现在包含COLLATEAT运算符。

相关问题