Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Aggregierte Zeichenfolgenverbindung in Oracle 10g

Oracle 11g hat diese nette Funktion LISTAGG, die ziemlich genau das ist, was Sie wollen, aber da Sie auf 10g sind, steht Ihnen diese nicht zur Verfügung (es sei denn, Sie entscheiden sich für ein Upgrade).

Wenn Sie aus irgendeinem Grund nicht auf 11g upgraden möchten (oder aus welchen Gründen auch immer nicht können), würde ich vorschlagen, sich einige Alternativen zu LISTAGG anzusehen, die Ihnen auf 10g zur Verfügung stehen.

Sie können sich einige der vorgeschlagenen Alternativen ansehen hier

Schnell angepasst eine schnelle Anpassung einer der vorgeschlagenen Alternativen an Ihr Fallbeispiel:

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;

Denken Sie jedoch daran, dass dies nicht die eigentliche Lösung ist, da Sie sie entsprechend Ihrem Tisch (nicht dem Dummy-DUAL-Tisch) usw. anpassen müssen.

Ihre Lösung wird wahrscheinlich in etwa so aussehen:

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

Wenn Sie das Trennzeichen ändern möchten, können Sie es in diesem Teil von Komma ändern:

(E, NAME||',')

Das RTRIM dient nur dazu, das nachgestellte Komma am Ende der verketteten Zeichenfolge abzuschneiden. Wenn Sie das nachgestellte Komma nicht stört, können Sie die RTRIM-Funktion weglassen, um die Lesbarkeit zu erhalten.