sql >> データベース >  >> RDS >> Oracle

OracleでCoalesce関数を使用する方法

    合体関数とは

    合体関数 は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関数の違い

    1. CoalesceはNVL関数の一般化です。 NVL関数は2つの式に使用できますが、合体は多くの式に使用できます
    2. 2つの式の場合、同じですが実装が異なります。OracleはNVLの場合は両方の式を評価し、合体の場合は最初の式を評価します。したがって、2番目の式にエラーがある場合、NVLはエラーをスローします。合体はしません。
    3. CoalesceはANSI標準ですが、NVLはOracle固有です

    関連記事

    OracleSqlチュートリアル
    OracleのNULLIF関数
    OracleのNVL関数
    OracleLISTAGG関数
    https://docs.oracle.com/cd/B28359_01/server.111/b28286/ Functions023.htm#SQLRF00617


    1. 挿入できません:エラー:配列値は{またはディメンション情報で始まる必要があります

    2. SQLのデータ型のサイズを変更します

    3. 別のテーブルに存在しない1つのテーブルからすべてのレコードを選択するにはどうすればよいですか?

    4. MySQLでデータベースを削除するSQLクエリ