首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么列表中的CASE表达式优先记录运算符?

为什么列表中的CASE表达式优先记录运算符?
EN

Database Administration用户
提问于 2020-07-25 15:43:06
回答 1查看 47关注 0票数 0

在这里的清单中:

https://mariadb.com/kb/en/operator-precedence/

BETWEEN操作符和比较运算符之间,case表达式被放在与NOT相同的优先级级别。

但是,case表达式始终以CASE开头,以END结尾,所有子表达式也由CASE关键字分隔。它们就像括号里的表达式,所以我不明白为什么案例表达式会出现在这个列表中。

如果将大小写表达式的优先级设置为较高或更低,是否有不同解析的SQL表达式?

举一个例子,在2 + 3 * 4中,当以以下两种方式使用括号时,我们得到了不同的结果:2 + (3 * 4)(2 + 3) * 4。这个问题是关于如何不可能对CASE做同样的事情。不能用+代替CASE,并显示两种不同的括号用法,结果在它们之间是不同的。

与其他RDBMSes相比,SQLitePostgreSQL都没有将CASE包含在运算符优先级列表中。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2020-07-30 23:50:53

文档是这样的,因为它准确地反映了源代码的这一部分

代码语言:javascript
复制
%left   OR_SYM OR2_SYM
%left   XOR
%left   AND_SYM AND_AND_SYM

%left   PREC_BELOW_NOT
%left   NOT_SYM

%left   BETWEEN_SYM CASE_SYM WHEN_SYM THEN_SYM ELSE
%left   '=' EQUAL_SYM GE '>' LE '<' NE IS LIKE SOUNDS_SYM REGEXP IN_SYM
%left   '|'
%left   '&'
%left   SHIFT_LEFT SHIFT_RIGHT
%left   '-' '+' ORACLE_CONCAT_SYM
%left   '*' '/' '%' DIV_SYM MOD_SYM
%left   '^'
%left   MYSQL_CONCAT_SYM
%left   NEG '~' NOT2_SYM BINARY

这与解析器的行为方式无关。例如,尽管1 + NOT 0在一个优先级较高的操作符后面跟随一个较低优先级的操作符会引发语法错误,但出于同样的原因,1 + CASE WHEN 1 THEN 1 END不会引发类似的语法错误。任何涉及CASE的表达式都将其视为具有最高优先级的运算符。

我现在想知道为什么源代码是这样表达的,尽管它不是那样的。不幸的是,我对野牛缺乏了解,不需要花更多的时间在这种好奇心上就能理解这种差异。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/271639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档