COLLATE运算符的优先级是什么?例如,在以下示例中:
COLLATE
SELECT 'a' || 'B' COLLATE someting
字符串我认为在这个特殊情况下,它被解释为:
SELECT 'a' || ('B' COLLATE something)
型但是有没有一个关于COLLATE关键字福尔斯落在哪里的确切规则的列表?那一节是不是说“所有其他运算符”?
prdp8dxp1#
通常,PostgreSQL文档提供:COLLATE子句比运算符绑定得更紧;必要时可以使用括号。
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运算符(另一个未在运算符优先级表中列出的运算符)绑定得更紧。如以下代码所示:
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运算符优先级表:
()
AT LOCAL
*
/
%
>>
|/
#
~
ESCAPE
BETWEEN
IN
LIKE
ILIKE
SIMILAR
<
>
=
<=
>=
<>
!=
IS
ISNULL
NOTNULL
IS DISTINCT FROM
NOT
AND
OR
INTERSECT
UNION
EXCEPT
说明:PostgreSQL源码。
**更新:**文档的最新开发版本现在包含COLLATE和AT运算符。
AT
2条答案
按热度按时间prdp8dxp1#
通常,PostgreSQL文档提供:
COLLATE
子句比运算符绑定得更紧;必要时可以使用括号。6yjfywim2#
我发现PostgreSQL文档中关于运算符优先级的内容非常缺乏,这让人沮丧。虽然SQL语法文档中确实指出:
COLLATE子句的绑定比运算符更紧密
这是不正确的。
PostgreSQL文档将
.
、::
和[]
作为运算符优先级表中的运算符列出,这些运算符比COLLATE
绑定得更紧,如以下表达式所示,不会导致错误:字符串
同时,“任何其他运算符”类别中的运算符绑定比
COLLATE
宽松。例如,我们讨论的||
运算符:型
它也比
AT TIME ZONE
运算符(另一个未在运算符优先级表中列出的运算符)绑定得更紧。如以下代码所示:型
我通过实验确定,
AT TIME ZONE
比一元+
/-
绑定得更紧,比求幂(^
)更松。COLLATE
运算符也比一元+
/-
绑定得更紧:型
我在此提供一个修改后的PostgreSQL运算符优先级表:
.
(表/列名分隔符)::
(铸型)()
(函数调用)[]
(数组访问器)+
-
(一元加,减)*
COLLATE
*
AT TIME ZONE
AT LOCAL
^
(求幂)*
/
%
(乘法、除法、取模)+
-
(加法、减法)||
、>>
、|/
、#
、~
)*
ESCAPE
BETWEEN
IN
LIKE
ILIKE
SIMILAR
<
>
=
<=
>=
<>
!=
(比较)IS
ISNULL
NOTNULL
IS DISTINCT FROM
等NOT
AND
OR
*
INTERSECT
*
UNION
EXCEPT
说明:PostgreSQL源码。
**更新:**文档的最新开发版本现在包含
COLLATE
和AT
运算符。