MySQL 8.0 リファレンスマニュアル


12.5 フロー制御関数

表 12.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 構文では、true である最初の value=compare_value 比較の result が返されます。 2 番目の構文は、true である最初の条件の結果を返します。 比較または条件が true の場合、ELSE が返された後の結果、または ELSE 部分がない場合は NULL が返されます。

    注記

    ここで説明する CASE operator の構文は、セクション13.6.5.1「CASE ステートメント」 で説明する SQL CASE statement の構文とは若干異なり、ストアドプログラム内で使用されます。 CASE ステートメントは ELSE NULL 句を持つことができず、END でなく、END CASE で終了します。

    CASE 式の結果の戻り型は、すべての結果値の集計型です:

    • すべてのタイプが数値の場合、集計タイプも数値になります:

      • 少なくとも 1 つの引数が倍精度の場合、結果は倍精度になります。

      • それ以外の場合、少なくとも 1 つの引数が DECIMAL であれば、結果は DECIMAL になります。

      • それ以外の場合、結果は整数型になります (ただし、次の例外があります):

        • すべての整数型がすべて符号付きまたは符号なしの場合、結果は同じ符号になり、精度は指定されたすべての整数型 (TINYINT, SMALLINT, MEDIUMINT, INT または BIGINT) の中で最も高くなります。

        • 符号付き整数型と符号なし整数型の組合せがある場合、結果は符号付きになり、精度が高くなる可能性があります。 たとえば、型が署名付き INT および署名なし INT の場合、結果は署名付き BIGINT になります。

        • 例外は、符号なし BIGINT と符号付き整数型を組み合せたものです。 その結果、精度とスケール 0 が十分な DECIMAL になります。

    • すべてのタイプが BIT の場合、結果は BIT になります。 それ以外の場合、BIT 引数は BIGINT と同様に扱われます。

    • すべてのタイプが YEAR の場合、結果は YEAR になります。 それ以外の場合、YEAR 引数は INT と同様に扱われます。

    • すべての型が文字列 (CHAR または VARCHAR) の場合、結果は、オペランドの最長文字長によって決定される最大長の VARCHAR になります。

    • すべての型が文字列またはバイナリ文字列の場合、結果は VARBINARY になります。

    • SET および ENUMVARCHAR と同様に処理され、結果は VARCHAR になります。

    • すべてのタイプが JSON の場合、結果は JSON になります。

    • すべての型が時間的な場合、結果は時間的になります:

      • すべての時間型が DATETIME または TIMESTAMP の場合、結果はそれぞれ DATETIME または TIMESTAMP になります。

      • それ以外の場合、時間型が混在すると、結果は DATETIME になります。

    • すべてのタイプが 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)

    expr1TRUE ( expr1 <> 0 および expr1 <> NULL) の場合、IF()expr2 を返します。 それ以外の場合は、expr3 を返します。

    注記

    IF ステートメントもありますが、ここで説明されている IF() 関数とは異なります。 セクション13.6.5.2「IF ステートメント」を参照してください。

    expr2expr3 の一方のみが明示的に NULL である場合は、IF() 関数の結果型は非 NULL 式の型になります。

    IF() のデフォルトの戻り型 (一時テーブルに格納されている場合でもかまいません) は、次のように計算されます:

    • expr2 または expr3 が文字列を生成する場合、結果は文字列になります。

      expr2expr3 の両方が文字列の場合、いずれかの文字列で大文字と小文字が区別されると、結果では大文字と小文字が区別されます。

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

    expr1NULL でない場合、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) のデフォルトの戻り型は、STRINGREAL または INTEGER の順で、2 つの式のうちより多くの「一般」です。 式や 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 が 2 回評価されます。


関連キーワード:  関数, expr, 空間, IF, リファレンス, IFNULL, WHEN, THEN, ELSE, タイプ