CASE式
CASE
式を使用すると、プロシージャを起動せずに、SQL文でIF
... THEN
... ELSE
論理を使用できます。構文は次のとおりです。
simple_case_expression::=
searched_case_expression::=
else_clause::=
単純CASE
式では、Oracle Databaseは、expr
とcomparison_expr
が一致する最初のWHEN
... THEN
の組合せを検索し、return_expr
を戻します。WHEN
... THEN
の組合せが条件に一致せず、ELSE
句が存在する場合、Oracleはelse_expr
を戻します。それ以外の場合、OracleはNULLを戻します。
検索CASE
式では、Oracleは、condition
が真である項目を左から右へ検索し、return_expr
を戻します。真であるcondition
がなく、ELSE
句が存在する場合、Oracleはelse_expr
を戻します。それ以外の場合、OracleはNULLを戻します。
Oracle Databaseでは、短絡評価を使用します。単純CASE
式では、データベースは、comparison_expr値のいずれかとexpr
を比較する前にすべてのcomparison_expr
値を評価するのではなく、各comparison_expr
値とexpr
を比較する前にのみ、各comparison_expr値を評価します。その結果、expr
と等しいcomparison_expr
が見つかると、Oracleはその後のcomparison_expr
を評価しません。検索CASE
式の場合、データベースは各condition
を評価してこれが真であるかどうかを判断します。ただし、あるcondition
が真の場合は、次のcondition
を評価しません。
単純CASE
式では、expr
およびすべてのcomparison_expr
値は、同じデータ型(CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、NUMBER
、BINARY_FLOAT
またはBINARY_DOUBLE
)であるか、またはすべて数値データ型である必要があります。すべての式が数値データ型の場合、Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
単純および検索CASE
式では、すべてのreturn_expr
は、同じデータ型(CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、NUMBER
、BINARY_FLOAT
またはBINARY_DOUBLE
)であるか、またはすべて数値データ型である必要があります。すべての戻り式が数値データ型の場合、Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
1つのCASE
式では、引数の最大数は65535です。単純CASE
式の初期式やオプションのELSE
式を含むすべての式が、この上限の対象となります。WHEN
... THEN
の各組は、2つの引数としてカウントします。この上限を超えないように、CASE
式をネストし、return_expr
自体をCASE
式にできます。
単純なCASE
式によって実行される比較は、比較される引数に文字データ型(CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
)が含まれる場合、照合依存です。照合決定ルールによって、使用する照合が決まります。
関連項目:
-
暗黙的な変換の詳細は、表2-9を参照してください
-
CASE
式の照合の導出および決定のルールは、『Oracle Databaseグローバリゼーション・サポート・ガイド』の付録Cを参照してください。 -
数値の優先順位の詳細は、数値の優先順位を参照してください。
-
その他の
CASE
式の書式については、「COALESCE」および「NULLIF」を参照してください。 -
CASE
式の様々な書式を使用した例は、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください。
単純なCASEの例
次の文は、サンプル表oe.customers
のそれぞれの顧客について、クレジット利用限度額を、$100の場合は「Low」、$5000の場合は「High」、それ以外の場合は「Medium」で表示します。
SELECT cust_last_name, CASE credit_limit WHEN 100 THEN 'Low' WHEN 5000 THEN 'High' ELSE 'Medium' END AS credit FROM customers ORDER BY cust_last_name, credit; CUST_LAST_NAME CREDIT -------------------- ------ Adjani Medium Adjani Medium Alexander Medium Alexander Medium Altman High Altman Medium . . .
検索CASEの例
次の文は、$2000を最少額の給与として、サンプル表oe.employees
の従業員の給与の平均を検出します。
SELECT AVG(CASE WHEN e.salary > 2000 THEN e.salary ELSE 2000 END) "Average Salary" FROM employees e; Average Salary -------------- 6461.68224