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)
(字串類型)。如果
為 true,則傳回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
兩次。
對於這些函式中的每一個,如果第一個引數僅包含第二個引數所使用的字元集和定序中存在的字元(並且它是常數),則會使用後者的字元集和定序進行比較。系統變數值會被當作具有相同字元和定序的資料行值來處理。使用這些函式與系統變數的某些查詢可能會因 定序的非法混合 而被拒絕。在這種情況下,您應該將系統變數轉換為正確的字元集和定序。