在这里的清单中:
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相比,SQLite和PostgreSQL都没有将CASE包含在运算符优先级列表中。
发布于 2020-07-30 23:50:53
文档是这样的,因为它准确地反映了源代码的这一部分:
%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的表达式都将其视为具有最高优先级的运算符。
我现在想知道为什么源代码是这样表达的,尽管它不是那样的。不幸的是,我对野牛缺乏了解,不需要花更多的时间在这种好奇心上就能理解这种差异。
https://dba.stackexchange.com/questions/271639
复制相似问题