文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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 與任何帶正負號的整數類型組合。結果是具有足夠精確度和比例 0 的 DECIMAL

    • 如果所有類型都是 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 不是 NULLIFNULL() 會傳回 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 為 true,則傳回 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 兩次。

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