2017-09-27 1 views
0

Besoin d'obtenir de DB certaines valeurs comme> « valeur1, valeur2, ... value100 » mais dans le cas où je recive plus de 100 valeurs doivent faire « valeur1, valeur2, ... value100 .. » savoir ce n'est pas toutes les valeurs mais je veux montrer 100 valeurs maximales maintenant je l'aideORACLE SQL LISTAGG avec le cas quand je reçois plus de 100 résultats

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

mais cela ne fonctionne comme je l'ai besoin.

+0

Depuis Oracle 12.2 vous pouvez utiliser le clause "sur débordement". http://modern-sql.com/feature/listagg#syntax Fonctionne en fonction de la longueur de la chaîne de résultats et non du nombre d'éléments agrégés. –

Répondre

2

Vous pouvez le faire comme ceci:

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 

Dans mon exemple, je veux afficher seulement trois éléments, ainsi que « ... » s'il y a d'autres éléments disponibles. Donc, tout d'abord, nous filtrons les résultats sur les quatre premières lignes pour chaque identifiant. Pour ce faire, j'ai utilisé la fonction analytique ROW_NUMBER pour étiqueter chaque ligne avec un numéro dans l'ordre ascendant val pour chaque id. Une fois que nous connaissons les numéros de ligne, nous pouvons filtrer les lignes pour retourner le nombre attendu d'éléments + 1 - nous avons besoin de la ligne supplémentaire pour savoir s'il y a plus de lignes disponibles ou non. Dans mon cas, cela signifie que nous devons obtenir les 4 premières lignes.

Ensuite, nous avons besoin d'une instruction case pour sortir la valeur réelle pour les trois premiers éléments, et "..." pour le quatrième élément, si présent. Ensuite, nous pouvons incorporer cela dans le LISTAGG et le tour est joué!


Bien sûr, précède suppose que votre base de données ne sont pas à la version 12.2 - si elle est, vous pouvez profiter des améliorations de débordement - voir here for more information