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_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
および 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
= 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
が 2 回評価されます。