CASE
value
WHENcompare_value
THENresult
[WHENcompare_value
THENresult
...] [ELSEresult
] ENDCASE WHEN
condition
THENresult
[WHENcondition
THENresult
...] [ELSEresult
] END第一個
CASE
語法會傳回第一個
比較結果為 true 的value
=compare_value
result
。第二個語法會傳回第一個條件為 true 的結果。如果沒有比較或條件為 true,則會傳回ELSE
後面的結果,如果沒有ELSE
部分,則會傳回NULL
。注意此處描述的
CASE
運算子 的語法與CASE
陳述式 的 SQL 語法略有不同,後者在 第 15.6.5.1 節,「CASE 陳述式」中描述,用於儲存程式內部。CASE
陳述式不能有ELSE NULL
子句,並且以END CASE
而非END
終止。CASE
運算式結果的傳回類型是所有結果值的彙總類型mysql> SELECT CASE 1 WHEN 1 THEN 'one' -> WHEN 2 THEN 'two' ELSE 'more' END; -> 'one' mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; -> 'true' mysql> SELECT CASE BINARY 'B' -> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END; -> NULL
如果
expr1
為TRUE
(
且expr1
<> 0
),expr1
IS NOT NULLIF()
會傳回expr2
。否則,它會傳回expr3
。注意還有一個
IF
陳述式,它與此處描述的IF()
函式 不同。請參閱第 15.6.5.2 節「IF 陳述式」。如果
expr2
或expr3
中只有一個明確為NULL
,則IF()
函式的結果類型為非NULL
表達式的類型。IF()
的預設傳回類型(當它儲存到暫存表格時可能很重要)的計算方式如下如果
expr2
或expr3
產生字串,則結果為字串。如果
expr2
和expr3
都是字串,則如果任一字串區分大小寫,則結果區分大小寫。如果
expr2
或expr3
產生浮點數值,則結果為浮點數值。如果
expr2
或expr3
產生整數,則結果為整數。
mysql> SELECT IF(1>2,2,3); -> 3 mysql> SELECT IF(1<2,'yes','no'); -> 'yes' mysql> SELECT IF(STRCMP('test','test1'),'no','yes'); -> 'no'
如果
expr1
不是NULL
,則IFNULL()
會傳回expr1
;否則,它會傳回expr2
。mysql> SELECT IFNULL(1,0); -> 1 mysql> SELECT IFNULL(NULL,10); -> 10 mysql> SELECT IFNULL(1/0,10); -> 10 mysql> SELECT IFNULL(1/0,'yes'); -> 'yes'
IFNULL(
的預設傳回類型是兩個表達式中較「一般」的類型,順序為expr1
,expr2
)STRING
、REAL
或INTEGER
。考慮基於表達式的表格的情況,或者 MySQL 必須在暫存表格中內部儲存IFNULL()
傳回的值的情況。mysql> CREATE TABLE tmp SELECT IFNULL(1,'test') AS test; mysql> DESCRIBE tmp; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | test | varbinary(4) | NO | | | | +-------+--------------+------+-----+---------+-------+
在此範例中,
test
欄位的類型為VARBINARY(4)
(字串類型)。如果
為真,則傳回expr1
=expr2
NULL
,否則傳回expr1
。這與CASE WHEN
相同。expr1
=expr2
THEN NULL ELSEexpr1
END傳回值的類型與第一個參數相同。
mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1
注意如果參數不相等,MySQL 會評估
expr1
兩次。
對於這些函式中的每一個,如果第一個參數僅包含第二個參數使用的字元集和定序中存在的字元(且它是常數),則會使用後者的字元集和定序進行比較。系統變數值會被處理為具有相同字元和定序的欄位值。因此,一些使用這些函式和系統變數的查詢可能會被拒絕,並產生 Illegal mix of collations 的錯誤。在這種情況下,您應該將系統變數轉換為正確的字元集和定序。