2017-06-29 4 views
0

Ich habe Tabelle foo (id INTEGER, Werte VARCHAR []):gemeinsame Elemente von Arrays in Ergebnismenge - PostgreSQL

Id/Values 
1/A,B,C 
2/A,C 

Ich möchte Abfrage schreiben, die nur Elemente in Werte Array zurückgibt gemeinsam für alle Aufzeichnungen.

Also für oben I A erhalten möchte, C

Alle Iden? Vielen Dank!

+0

Dank fand ich Lösung hier: https://stackoverflow.com/questions/37716219/postgres-overlap-arrays-from-one-column – user1038334

Antwort

1
with t (id, values) as (values 
    (1, '{A,B,C}'::varchar[]), 
    (2, '{A,C}') 
) 
select v 
from 
    t 
    cross join lateral 
    unnest(values) v(v) 
group by v 
having count(*) = (select count(*) from t) 
; 
v 
--- 
C 
A 
+0

über war die Notiz ähnliche Sache :) schreiben: du brauchst keine Kreuzverbindung mit "lateral". Einfache 'SELECT v FROM t, LATERAL unnest (Werte) v (v) GROUP BY vv HAVING count (vv)> 1 'würde das gleiche tun :) –

+0

@ KristoMägi Ich denke, es ist klarer zu explizit die' cross join' –

+0

Verstehen der klarere Teil, aber Query Plan sieht besser aus ohne Cross Join Lösung;) Aber wenn es nicht viel von Daten gibt, dann ist es egal - nur ein kleiner Optimierungstrick :) –

Verwandte Themen