Mysql

為什麼列表中的 CASE 表達式記錄運算符優先級?

  • July 31, 2020

在這裡的列表中:

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

case-expressions 在運算符和比較運算符BETWEEN之間被置於與 , 相同的優先級。NOT

但是,case 表達式總是以 開頭CASE和結尾END,並且所有子表達式也由CASE關鍵字分隔。它們就像括號表達式,所以我不明白為什麼 case-expressions 在這個列表中。

如果將 case-expression 的優先級設置得更高或更低,是否存在會以不同方式解析的 SQL 表達式?

舉個例子,2 + 3 * 4當括號以這兩種方式使用時,我們會得到不同的結果:2 + (3 * 4)(2 + 3) * 4。這個問題是關於如何不可能對CASE. 不能替代+for的使用CASE並顯示括號的 2 種不同用法,從而導致它們之間的結果不同。

為了與其他 RDBMS 進行比較,SQLitePostgreSQL都沒有包含CASE在它們的運算符優先級列表中。

文件就是這樣,因為它準確反映了這部分原始碼

%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