CASEvalueWHENcompare_valueTHENresult[WHENcompare_valueTHENresult...] [ELSEresult] ENDCASE WHENconditionTHENresult[WHENconditionTHENresult...] [ELSEresult] END第一個
CASE語法會傳回第一個比較為 true 的value=compare_valueresult。第二個語法會傳回第一個條件為 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),expr1IS 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=expr2NULL,否則傳回expr1。這與CASE WHEN相同。expr1=expr2THEN NULL ELSEexpr1END傳回值的類型與第一個引數相同。
mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1注意如果引數不相等,MySQL 會評估
expr1兩次。
對於這些函式中的每一個,如果第一個引數僅包含第二個引數所使用的字元集和定序中存在的字元(並且它是常數),則會使用後者的字元集和定序進行比較。系統變數值會被當作具有相同字元和定序的資料行值來處理。使用這些函式與系統變數的某些查詢可能會因 定序的非法混合 而被拒絕。在這種情況下,您應該將系統變數轉換為正確的字元集和定序。