Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

12.5 フロー制御関数

表 12.7 「フロー制御演算子」

名前説明
CASE CASE 演算子
IF() If/else 構文
IFNULL() Null if/else 構文
NULLIF() expr1 = expr2 の場合に NULL を返します

  • CASEvalue WHENcompare_value THENresult [WHENcompare_value THENresult ...] [ELSEresult] END

    CASE WHENcondition THENresult [WHENcondition THENresult ...] [ELSEresult] END

    最初のCASE 構文では、true である最初のvalue=compare_value 比較のresult が返されます。 2 番目の構文は、true である最初の条件の結果を返します。 比較または条件が true の場合、ELSE が返された後の結果、またはELSE 部分がない場合はNULL が返されます。

    注記

    ここで説明するCASEoperator の構文は、セクション13.6.5.1「CASE ステートメント」 で説明する SQLCASEstatement の構文とは若干異なり、ストアドプログラム内で使用されます。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);        -> 3mysql> 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);        -> 1mysql> SELECT IFNULL(NULL,10);        -> 10mysql> SELECT IFNULL(1/0,10);        -> 10mysql> 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 WHENexpr1 =expr2 THEN NULL ELSEexpr1 END と同じです。

    戻り値の型は最初の引数と同じです。

    mysql> SELECT NULLIF(1,1);        -> NULLmysql> SELECT NULLIF(1,2);        -> 1
    注記

    引数が等しくない場合は、MySQL でexpr1 が 2 回評価されます。