MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む
このページは機械翻訳したものです。
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_valueresult が返されます。 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 および ENUM は VARCHAR と同様に処理され、結果は VARCHAR になります。
すべてのタイプが JSON の場合、結果は JSON になります。
すべての型が時間的な場合、結果は時間的になります:
すべての時間型が DATE、TIME または TIMESTAMP の場合、結果はそれぞれ DATE、TIME または 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)
expr1 が TRUE ( およびexpr1 <> 0 ) の場合、expr1 <> NULLIF() は expr2 を返します。 それ以外の場合は、expr3 を返します。
IF ステートメントもありますが、ここで説明されている IF() 関数とは異なります。 セクション13.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'
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)STRING、REAL または 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)
が true の場合は expr1 = expr2NULL を返し、それ以外の場合は 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 回評価されます。