合体関数とは
合体関数 はOracleの便利な関数であり、リストの最初のnull以外の値を返したい場合に非常に便利です。このSQLチュートリアルでは、説明、OracleのCoalesce関数の例、およびCoalesceとNVLの違いについて説明します。
expr1 :nullでない場合に返されます
expr2:nullでなく、最初の式がnullの場合に返されます
exprn:前の式がnullの場合に返されます
したがって、OracleのCoalesceは、nullでない場合は最初の式を返し、それ以外の場合は式の残りの部分を合体させます
。重要なポイント
(1)OracleDatabaseは短絡評価を使用します。データベースは、すべてのexpr値を評価してから、いずれかがNULLであるかどうかを判断するのではなく、各expr値を評価してNULLかどうかを判断します。
(2)OracleのCOALESCEはCase関数と同等です
したがって、COALESCE(expr1、expr2)は次と同等です:
CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END
同様に、
COALESCE(expr1、expr2、…、exprn)、n> =3の場合、次と同等です:
CASE WHEN expr1 IS NOT NULL THEN expr1 WHEN expr2 IS NOT NULL THEN expr2 WHEN expr3 IS NOT NULL THEN expr3 WHEN exprn IS NOT NULL THEN exprn END
または、これは次のように書くことができます
CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE COALESCE (expr2, ..., exprn) END
(3)通常、colesceステートメントのすべてのexprは同じデータ型である必要があります。そうでない場合、ORA-00932が返されます。
SQL> select coalesce('a',1,2) from dual; select coalesce('a',1,2) from dual * ERROR at line 1: ORA-00932: inconsistent datatypes: expected CHAR got NUMBER
式のすべてのオカレンスが数値データ型または数値データ型に暗黙的に変換できる非数値データ型である場合、Oracle Databaseは数値の優先順位が最も高い引数を判別し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を返します。
合体関数の使い方
SQL> select coalesce(1,2,3) from dual; COALESCE(1,2,3) --------------- 1 SQL> SELECT COALESCE(null, null, null, 'X', 'Y'); COALESCE(...) --------------- X
合体の例
address1、address2、address3で構成されるemployee oracleテーブルがあり、テーブルから従業員の最初のnull以外のアドレスを優先度address1> address2> address3
の順に出力するとします。select emp_name, COALESCE(address1,address2,address3) from employee;
合体とNVL関数の違い
- CoalesceはNVL関数の一般化です。 NVL関数は2つの式に使用できますが、合体は多くの式に使用できます
- 2つの式の場合、同じですが実装が異なります。OracleはNVLの場合は両方の式を評価し、合体の場合は最初の式を評価します。したがって、2番目の式にエラーがある場合、NVLはエラーをスローします。合体はしません。
- CoalesceはANSI標準ですが、NVLはOracle固有です
関連記事
OracleSqlチュートリアル
OracleのNULLIF関数
OracleのNVL関数
OracleLISTAGG関数
https://docs.oracle.com/cd/B28359_01/server.111/b28286/ Functions023.htm#SQLRF00617