CASE式

CASE式を使用すると、プロシージャを起動せずに、SQL文でIF ... THEN ... ELSE論理を使用できます。構文は次のとおりです。

simple_case_expression::=

searched_case_expression::=

else_clause::=

単純CASE式では、Oracle Databaseは、exprcomparison_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値は、同じデータ型(CHARVARCHAR2NCHARNVARCHAR2NUMBERBINARY_FLOATまたはBINARY_DOUBLE)であるか、またはすべて数値データ型である必要があります。すべての式が数値データ型の場合、Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。

単純および検索CASE式では、すべてのreturn_exprは、同じデータ型(CHARVARCHAR2NCHARNVARCHAR2NUMBERBINARY_FLOATまたはBINARY_DOUBLE)であるか、またはすべて数値データ型である必要があります。すべての戻り式が数値データ型の場合、Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。

1つのCASE式では、引数の最大数は65535です。単純CASE式の初期式やオプションのELSE式を含むすべての式が、この上限の対象となります。WHEN ... THENの各組は、2つの引数としてカウントします。この上限を超えないように、CASE式をネストし、return_expr自体をCASE式にできます。

単純なCASE式によって実行される比較は、比較される引数に文字データ型(CHARVARCHAR2NCHARまたはNVARCHAR2)が含まれる場合、照合依存です。照合決定ルールによって、使用する照合が決まります。

関連項目:

単純な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