このページは機械翻訳したものです。
-
CASEvalueWHENcompare_valueTHENresult[WHENcompare_valueTHENresult...] [ELSEresult] ENDCASE WHENconditionTHENresult[WHENconditionTHENresult...] [ELSEresult] END最初の
CASE構文では、true である最初の比較のvalue=compare_valueresultが返されます。 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および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=expr2THEN NULL ELSEexpr1END戻り値の型は最初の引数と同じです。
mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1注記引数が等しくない場合は、MySQL で
expr1が 2 回評価されます。