-
CASE
value
WHENcompare_value
THENresult
[WHENcompare_value
THENresult
...] [ELSEresult
] ENDCASE WHEN
condition
THENresult
[WHENcondition
THENresult
...] [ELSEresult
] END最初の
CASE
構文では、true である最初の
比較のvalue
=compare_value
result
が返されます。 2 番目の構文は、true である最初の条件の結果を返します。 比較または条件が true の場合、ELSE
が返された後の結果、またはELSE
部分がない場合はNULL
が返されます。注記ここで説明する
CASE
operator の構文は、セクション13.6.5.1「CASE ステートメント」 で説明する SQLCASE
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
<> 0expr1
<> 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 ELSEexpr1
END戻り値の型は最初の引数と同じです。
mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1
注記引数が等しくない場合は、MySQL で
expr1
が 2 回評価されます。