2017-09-27 7 views
0

Benötigen von DB erhalten einige Werte als> „Wert1, Wert2, ... value100“ aber im Falle, wenn ich mehr als 100 Werte müssen recive werden tun „Wert1, Wert2, ... value100 ..“ wissen, dass es nicht alle Werte, aber ich zeigen will maximal 100 Werte jetzt ichORACLE SQL LISTAGG mit Fall, wenn ich mehr als 100 Ergebnisse erhalten

select LISTAGG(CASE WHEN ROWNUM <=100 THEN within.number ELSE NULL END,', ') 
     WITHIN GROUP (ORDER BY within.number) 
from ........... 

verwenden, aber das bedeutet nicht funktioniert, wie ich brauche.

+0

Da Oracle 12.2 Sie die verwenden können, Überlauf-Klausel. http://modern-sql.com/feature/listagg#syntax Es funktioniert basierend auf der Länge der Ergebniszeichenfolge, nicht auf der Anzahl der aggregierten Elemente. –

Antwort

2

Sie können dies wie folgt:

WITH sample_data AS (SELECT 1 ID, 'a' val FROM dual UNION ALL 
        SELECT 1 ID, 'b' val FROM dual UNION ALL 
        SELECT 1 ID, 'c' val FROM dual UNION ALL 
        SELECT 2 ID, 'd' val FROM dual UNION ALL 
        SELECT 2 ID, 'e' val FROM dual UNION ALL 
        SELECT 2 ID, 'f' val FROM dual UNION ALL 
        SELECT 2 ID, 'g' val FROM dual UNION ALL 
        SELECT 3 ID, 'h' val FROM dual UNION ALL 
        SELECT 3 ID, 'i' val FROM dual UNION ALL 
        SELECT 3 ID, 'h' val FROM dual UNION ALL 
        SELECT 3 ID, 'j' val FROM dual UNION ALL 
        SELECT 3 ID, 'k' val FROM dual UNION ALL 
        SELECT 4 ID, 'l' val FROM dual UNION ALL 
        SELECT 4 ID, 'm' val FROM dual UNION ALL 
        SELECT 5 ID, 'n' val FROM dual) 
SELECT ID, 
     listagg(CASE WHEN rn <= 3 THEN val ELSE '...' END, ',') WITHIN GROUP (ORDER BY val) vals 
FROM (SELECT ID, 
       val, 
       row_number() OVER (PARTITION BY ID ORDER BY val) rn 
     FROM sample_data) 
WHERE rn <= 4 -- max amount of expected elements + 1 
GROUP BY ID; 

ID VALS 
--- ----------- 
    1 a,b,c 
    2 d,e,f,... 
    3 h,h,i,... 
    4 l,m 
    5 n 

In meinem Beispiel möchte ich nur drei Elemente angezeigt werden, zusammen mit „...“, wenn es weitere Elemente. Zunächst filtern wir die Ergebnisse für jede ID in nur die ersten vier Zeilen.

Um dies zu tun, habe ich die analytische Funktion ROW_NUMBER verwendet, um jede Zeile mit einer Zahl in aufsteigender Reihenfolge für jede ID zu beschriften.

Sobald wir die Zeilennummern kennen, können wir die Zeilen filtern, um die erwartete Anzahl von Elementen + 1 zurückzugeben - wir brauchen die zusätzliche Zeile, um zu wissen, ob mehr Zeilen verfügbar sind oder nicht. In meinem Fall bedeutet das, dass wir die ersten 4 Reihen bekommen müssen.

Als nächstes benötigen wir eine case-Anweisung, um den tatsächlichen Wert für die ersten drei Elemente und "..." für das vierte Element, falls vorhanden, auszugeben.

Dann können wir das in die LISTAGG integrieren und voila!


Natürlich nimmt die oben, dass die Datenbank nicht in der Version 12.2 ist - wenn ja, dann können Sie die Vorteile der neuen Überlauf Erweiterungen nehmen - siehe here for more information

Verwandte Themen