Sql-certificate-conditional-expressions

提供:Dev Guides
移動先:案内検索

条件式を使用する

一般的な機能

データベース内のNULL値を処理するには、一般関数を使用します。 一般的なNULL処理関数の目的は、NULL値を代替値に置き換えることです。 以下にこれらの機能を簡単に説明します。

NVL

NVL関数は、NULL値を代替値に置き換えます。

構文:

NVL( Arg1, replace_with )

構文では、両方のパラメーターが必須です。 NVL関数は、すべての種類のデータ型で機能することに注意してください。 また、元の文字列と置換のデータ型は互換性のある状態である必要があります。 Oracleと同じまたは暗黙的に変換可能。

arg1が文字値の場合、oracleは置換文字列をarg1と互換性のあるデータ型に変換してから比較し、expr1の文字セットでVARCHAR2を返します。 arg1が数値の場合、Oracleは数値の優先順位が最も高い引数を決定し、他の引数をそのデータ型に暗黙的に変換し、そのデータ型を返します。

従業員がまだどのジョブにも割り当てられていない場合、以下のSELECTステートメントには「n/a」が表示されます。 JOB_IDはNULLです。 それ以外の場合は、実際のJOB_ID値が表示されます。

SELECT  first_name, NVL(JOB_ID, 'n/a')
FROM employees;

NVL2

NVLの機能強化として、OracleはNULL列値だけでなくNOT NULL列の値も置換する機能を導入しました。 NVL2関数を使用して、NULL値と非NULL値を代替値で置き換えることができます。

構文:

NVL2( string1, value_if_NOT_null, value_if_null )

従業員のJOB_CODEがNULLの場合、以下のSELECTステートメントは「Bench」を表示します。 JOB CODEがnull以外の明確な値の場合、定数値「Job Assigned」が表示されます。

SQL> SELECT NVL2(JOB_CODE, 'Job Assigned', 'Bench')
FROM employees;

NULLIF

NULLIF関数は、2つの引数expr1とexpr2を比較します。 expr1とexpr2が等しい場合、NULLを返します。それ以外の場合、expr1を返します。 他のNULL処理関数とは異なり、最初の引数はNULLにはできません。

構文:

NULLIF (expr1, expr2)

最初の引数はNULLと評価される式にすることができますが、リテラルNULLにすることはできません。 両方のパラメーターは、関数を実行するために必須です。

以下のクエリは、両方の入力値12が等しいため、NULLを返します。

SELECT  NULLIF (12, 12)
FROM DUAL;

同様に、以下のクエリは両方の文字列が等しくないため「SUN」を返します。

SELECT NULLIF ('SUN', 'MOON')
FROM DUAL;

コーレス

NVLのより一般的な形式であるCOALESCE関数は、引数リストの最初の非ヌル式を返します。 最小2つの必須パラメーターを取りますが、最大引数には制限がありません。

構文:

COALESCE (expr1, expr2, ... expr_n )

以下のSELECTクエリを検討してください。 従業員の住所フィールドに入力された最初の非ヌル値を選択します。

SELECT COALESCE (address1, address2, address3) Address
FROM  employees;

興味深いことに、COALESCE関数の機能はIF..ELSIF..ENDIFコンストラクトに似ています。 上記のクエリは次のように書き換えることができます-

IF address1 is not null THEN
   result := address1;
ELSIF address2 is not null THEN
   result := address2;
ELSIF address3 is not null THEN
   result := address3;
ELSE
   result := null;
END IF;

条件関数

Oracleには、SQL文でも条件を課すための条件関数DECODEおよびCASEが用意されています。

DECODE関数

この関数は、IF..THEN..ELSE条件付き手続き文とSQLで同等です。 DECODEは、すべてのデータ型の値/列/式で機能します。

構文:

DECODE (expression, search, result [, search, result]... [, default])

DECODE関数は、式を各検索値と順番に比較します。 式と検索引数が等しい場合、対応する結果を返します。 一致しない場合、定義されている場合はデフォルト値が返され、定義されていない場合はNULLが返されます。 型の互換性が一致しない場合、oracleは暗黙的に潜在的な変換を実行して結果を返します。

実際問題として、OracleはDECODE関数を使用している間、2つのNULLは同等であると見なします。

SELECT DECODE(NULL,NULL,'EQUAL','NOT EQUAL')
FROM DUAL;

DECOD
-----
EQUAL

expressionがnullの場合、Oracleは、nullである最初の検索の結果を返します。 DECODE関数のコンポーネントの最大数は255です。

SELECT  first_name, salary, DECODE (hire_date, sysdate,'NEW JOINEE','EMPLOYEE')
    FROM employees;

CASE式

CASE式はDECODEと同じ概念で機能しますが、構文と使用法が異なります。

構文:

CASE  [ expression ]
   WHEN condition_1 THEN result_1
   WHEN condition_2 THEN result_2
   ...
   WHEN condition_n THEN result_n
   ELSE result
END

Oracle検索は、左から始まり、真の条件が見つかるまで右に移動し、それに関連する結果式を返します。 条件に該当するものが見つからず、ELSE句が存在する場合、Oracleはelseで定義された結果を返します。 それ以外の場合、Oracleはnullを返します。

CASE式の引数の最大数は255です。 単純なCASE式の初期式およびオプションのELSE式を含め、すべての式はこの制限にカウントされます。 それぞれいつ…​ THENペアは2つの引数としてカウントされます。 この制限を超えないようにするために、return_expr自体がCASE式になるようにCASE式をネストすることができます。

SELECT first_name, CASE WHEN salary < 200 THEN 'GRADE 1'
            WHEN salary > 200 AND salary < 5000 THEN 'GRADE 2'
            ELSE 'GRADE 3'
           END CASE
FROM employees;

ENAM    CASE
----    -------
JOHN    GRADE 2
EDWIN   GRADE 3
KING    GRADE 1