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

OracleのLISTAGG()関数

    Oracleでは、LISTAGG() 関数を使用すると、複数の行のデータを1つの行に結合できます。

    区切り文字(コンマなど)を指定するオプションがあります。 LISTAGG()によって生成された結果を注文することもできます 機能など。

    構文

    構文は次のようになります:

    LISTAGG( [ ALL | DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
      [ WITHIN GROUP order_by_clause ] [OVER query_partition_clause]

    listagg_overflow_clauseの場所 は:

    { ON OVERFLOW ERROR }
    |
    { ON OVERFLOW TRUNCATE [ 'truncation-indicator' ] [ { WITH | WITHOUT } COUNT ] }

    次のクエリを実行するとします。

    SELECT region_name
    FROM regions;

    結果:

                  REGION_NAME 
    _________________________ 
    Europe                    
    Americas                  
    Asia                      
    Middle East and Africa    

    LISTAGG()を使用できます これらの結果をコンマ区切りのリストに変換するには:

    SELECT LISTAGG(region_name, ', ')
    FROM regions;

    結果:

                             LISTAGG(REGION_NAME,',') 
    _________________________________________________ 
    Europe, Americas, Asia, Middle East and Africa    

    セパレータを変更する

    2番目の引数を別の区切り文字に変更できます:

    SELECT LISTAGG(region_name, '; ') 
    FROM regions;

    結果:

    Europe; Americas; Asia; Middle East and Africa 

    セパレータを省略

    2番目の引数を省略して、各値を区切り文字なしで連結することができます:

    SELECT LISTAGG(region_name) 
    FROM regions;

    結果:

    EuropeAmericasAsiaMiddle East and Africa

    結果を注文する

    WITHIN GROUP (ORDER BY...)を使用できます LISTAGG()の出力を順序付ける句 機能:

    SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC) 
    FROM regions;

    結果:

    Americas,Asia,Europe,Middle East and Africa

    グループ化されたクエリでの使用

    LISTAGG()を使用できます グループ化されたクエリ内で機能して、次のような結果を提供します:

    SELECT 
        region_id,
        LISTAGG(country_id, ', ') WITHIN GROUP (ORDER BY country_id ASC) AS "Countries"
    FROM countries
    GROUP BY region_id
    ORDER BY region_id;

    結果:

       REGION_ID                         Countries 
    ____________ _________________________________ 
               1 BE, CH, DE, DK, FR, IT, NL, UK    
               2 AR, BR, CA, MX, US                
               3 AU, CN, HK, IN, JP, SG            
               4 EG, IL, KW, NG, ZM, ZW           

    個別の値のみを返す

    DISTINCTを使用できます 一意の値のみを返す句:

    SELECT LISTAGG(DISTINCT region_id, ', ') 
    FROM regions;

    結果:

    1, 2, 3, 4

    この関数で実行できることの詳細については、Oracleのドキュメントを参照してください。


    1. SQLServerデータベースにすべてのストアドプロシージャを一覧表示する3つの方法

    2. OPENJSON「キーワード「with」の近くの構文が正しくありません。」 SQL Server(解決済み)

    3. MySQLでauto_incrementID列の断片化を処理する方法

    4. INNERJOINでCROSSAPPLYを使用する必要があるのはいつですか?