Sql-certificate-conditional-expressions
条件式を使用する
一般的な機能
データベース内の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