Mysql
為什麼列表中的 CASE 表達式記錄運算符優先級?
在這裡的列表中:
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 進行比較,SQLite和PostgreSQL都沒有包含
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
都將其視為最高優先級的運算符。我現在想知道為什麼儘管原始碼的行為不是那樣,但為什麼會這樣表達。不幸的是,我缺乏對野牛的了解,無法在沒有花更多時間在這種好奇心上的情況下理解這種差異。