文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式 Letter) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  函數與運算子  /  流程控制函數

14.5 流程控制函數

表格 14.7 流程控制運算子

名稱 說明
CASE Case 運算子
IF() If/else 建構
IFNULL() Null if/else 建構
NULLIF() 如果 expr1 = expr2 則傳回 NULL

  • CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END

    CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END

    第一個 CASE 語法會傳回第一個 value=compare_value 比較結果為 true 的 result。第二個語法會傳回第一個條件為 true 的結果。如果沒有比較或條件為 true,則會傳回 ELSE 後面的結果,如果沒有 ELSE 部分,則會傳回 NULL

    注意

    此處描述的 CASE 運算子 的語法與 CASE 陳述式 的 SQL 語法略有不同,後者在 第 15.6.5.1 節,「CASE 陳述式」中描述,用於儲存程式內部。CASE 陳述式不能有 ELSE NULL 子句,並且以 END CASE 而非 END 終止。

    CASE 運算式結果的傳回類型是所有結果值的彙總類型

    • 如果所有類型都是數值,則彙總類型也是數值

      • 如果至少有一個引數是雙精度浮點數,則結果是雙精度浮點數。

      • 否則,如果至少有一個引數是 DECIMAL,則結果是 DECIMAL

      • 否則,結果是整數類型 (有一個例外)

        • 如果所有整數類型都是帶正負號或都是不帶正負號的,則結果具有相同的正負號,並且精確度是所有指定的整數類型中最高的 (即,TINYINTSMALLINTMEDIUMINTINTBIGINT)。

        • 如果存在帶正負號和不帶正負號的整數類型組合,則結果是帶正負號的,並且精確度可能會更高。例如,如果類型是帶正負號的 INT 和不帶正負號的 INT,則結果是帶正負號的 BIGINT

        • 例外是不帶正負號的 BIGINT 與任何帶正負號的整數類型組合。結果是 DECIMAL,具有足夠的精確度且小數位數為 0。

    • 如果所有類型都是 BIT,則結果為 BIT。否則,BIT 參數會被視為類似 BIGINT

    • 如果所有類型都是 YEAR,則結果為 YEAR。否則,YEAR 參數會被視為類似 INT

    • 如果所有類型都是字元字串(CHARVARCHAR),則結果為 VARCHAR,其最大長度由運算元中最長的字元長度決定。

    • 如果所有類型都是字元或二進位字串,則結果為 VARBINARY

    • SETENUM 會被視為類似 VARCHAR;結果為 VARCHAR

    • 如果所有類型都是 JSON,則結果為 JSON

    • 如果所有類型都是時間類型,則結果為時間類型。

    • 如果所有類型都是 GEOMETRY,則結果為 GEOMETRY

    • 如果任何類型是 BLOB,則結果為 BLOB

    • 對於所有其他類型組合,結果為 VARCHAR

    • 在類型聚合時會忽略文字 NULL 運算元。

    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
  • IF(expr1,expr2,expr3)

    如果 expr1TRUEexpr1 <> 0expr1 IS NOT NULL),IF() 會傳回 expr2。否則,它會傳回 expr3

    注意

    還有一個 IF 陳述式,它與此處描述的 IF() 函式 不同。請參閱第 15.6.5.2 節「IF 陳述式」

    如果 expr2expr3 中只有一個明確為 NULL,則 IF() 函式的結果類型為非 NULL 表達式的類型。

    IF() 的預設傳回類型(當它儲存到暫存表格時可能很重要)的計算方式如下

    • 如果 expr2expr3 產生字串,則結果為字串。

      如果 expr2expr3 都是字串,則如果任一字串區分大小寫,則結果區分大小寫。

    • 如果 expr2expr3 產生浮點數值,則結果為浮點數值。

    • 如果 expr2expr3 產生整數,則結果為整數。

    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'
  • IFNULL(expr1,expr2)

    如果 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) 的預設傳回類型是兩個表達式中較「一般」的類型,順序為 STRINGREALINTEGER。考慮基於表達式的表格的情況,或者 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) (字串類型)。

  • NULLIF(expr1,expr2)

    如果 expr1 = expr2 為真,則傳回 NULL,否則傳回 expr1。這與 CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END 相同。

    傳回值的類型與第一個參數相同。

    mysql> SELECT NULLIF(1,1);
            -> NULL
    mysql> SELECT NULLIF(1,2);
            -> 1
    注意

    如果參數不相等,MySQL 會評估 expr1 兩次。

對於這些函式中的每一個,如果第一個參數僅包含第二個參數使用的字元集和定序中存在的字元(且它是常數),則會使用後者的字元集和定序進行比較。系統變數值會被處理為具有相同字元和定序的欄位值。因此,一些使用這些函式和系統變數的查詢可能會被拒絕,並產生 Illegal mix of collations 的錯誤。在這種情況下,您應該將系統變數轉換為正確的字元集和定序。