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

Oracle10gの集約文字列接続

    Oracle 11gには、この優れた関数LISTAGGがあります。これは、ほぼ必要なものですが、10gを使用しているため、アップグレードすることを決定しない限り、これを使用することはできません。

    何らかの理由で11gにアップグレードしたくない(または何らかの理由でアップグレードできない)場合は、10gで利用できるLISTAGGの代替案を検討することをお勧めします。

    提案された代替案のいくつかをチェックすることができますここ

    ケースシナリオに一致するように、提案された代替案の1つの迅速な適応を迅速に調整しました:

    WITH Q AS
    (
        SELECT 'North' POD, 'Rony' NAME FROM DUAL  UNION ALL
        SELECT 'North',     'James'     FROM DUAL  UNION ALL
        SELECT 'North',     'Aby'       FROM DUAL  UNION ALL
        SELECT 'South',     'Sam'       FROM DUAL  UNION ALL  
        SELECT 'South',     'Willy'     FROM DUAL  UNION ALL
        SELECT 'West',      'Mike'      FROM DUAL
    )
    SELECT   POD,
             RTRIM(
                XMLAGG (XMLELEMENT(e, name||',') ORDER BY name).EXTRACT('//text()'),
                ','
             ) AS name
        FROM q
    GROUP BY POD;
    

    ただし、これは実際の解決策ではないことに注意してください。テーブル(ダミーのDUALテーブルではない)などに応じて調整する必要があります...

    あなたの解決策はおそらく次のようなものに見えるでしょう:

    SELECT   POD,
             RTRIM(
                XMLAGG (XMLELEMENT(E, NAME||',') ORDER BY NAME).EXTRACT('//text()'),
                ','
             ) AS NAME
        FROM tbl1
    GROUP BY POD;
    

    区切り文字を変更する場合は、次の部分でカンマから変更できます:

    (E, NAME||',')
    

    RTRIMは、連結された文字列の末尾から末尾のカンマを切り取るためだけにあります。末尾のカンマに煩わされない場合は、読みやすさを維持するためにRTRIM関数を省略できます。



    1. テーブルにFULLTEXTインデックスを割り当てることができません

    2. データベースのトランザクションログがいっぱいです

    3. SQLでの制約の確認

    4. OracleのLISTAGG関数を一意のフィルターで使用するにはどうすればよいですか?