2017-04-10 13 views
0

Kann mir jemand hier helfen, die unten Problem zu lösen,SQL-Abfrage mit LISTAGG und CASE-Anweisung

Ich wollte CASE mit LISTAGG zur gleichen Zeit verwenden.

sql ich tue

LISTAGG(G.IGROUP_ID,'|') WITHIN GROUP (ORDER BY G.igroup_id) AS SERVICES 

So ist der Ausgang arbeitet so gut nur

**SERVICES** 
Row 1 : 50|100|128 
Row 2 : 100|100|128 

so ich hier einen Fall, oder wenn sonst Logik schreiben wollte (wenn 50 | 100 | 128) sollte es sich als "ja" anders darstellen, wenn 100 | 100 | 128 dann als

widerspiegeln sollte, kannst du mir bitte dabei helfen.

+0

Verwendung von ' listagg' schlägt vor, dass dies für Orakel ist. Ich habe das mysql-Tag entfernt und Oracle hinzugefügt. –

+0

Bearbeiten Sie Ihre Frage und geben Sie Beispieldaten und gewünschte Ergebnisse an. –

Antwort

2

Sie können dies mit dem case im listagg():

LISTAGG(CASE WHEN G.IGROUP_ID IN (50, 100, 128) THEN 'YES' ELSE 'NO' END) ,'|') 
    WITHIN GROUP (ORDER BY G.igroup_id) AS SERVICES 

Dies setzt voraus, dass alles, was nicht YES ist NO ist. Wenn dies nicht zutrifft, fügen Sie einfach eine weitere WHEN Klausel hinzu.

EDIT:

Eine wörtliche Auslegung der Frage würde vorschlagen:

(CASE LISTAGG(G.IGROUP_ID , '|') WITHIN GROUP (ORDER BY G.igroup_id) 
     WHEN '50|100|128' THEN 'Yes' 
     WHEN '100|100|128' THEN 'No' 
END) AS SERVICES 
+0

Dank @Gordon, Es funktioniert wie Charme, will nur ein wenig Wissen, gibt es trotzdem kann ich wie im Fall verwenden, für Ex wie '50 | 100% 'DANN als JA und' 100 | 100% 'dann nicht. Ich wollte so produzieren – Batman

+0

'CASE Col1 LIKE '50 | 100% 'THEN' 0'' funktioniert –

0
CASE WHEN LISTAGG(G.IGROUP_ID,'|') WITHIN GROUP (ORDER BY G.igroup_id) = '50|100|128' THEN 'YES' 
WHEN LISTAGG(G.IGROUP_ID,'|') WITHIN GROUP (ORDER BY G.igroup_id) = '100|100|128' THEN 'NO' END AS COL_NAME 

oder Sie können LISTAGG(G.IGROUP_ID,'|') WITHIN GROUP (ORDER BY G.igroup_id) AS SERVICES innerhalb einer Unterabfrage halten und gelten case in der äußeren Abfrage

Verwandte Themen