Schnittmenge mehrerer arrays in PostgreSQL
Habe ich eine Ansicht definiert als:
CREATE VIEW View1 AS
SELECT Field1, Field2, array_agg(Field3) AS AggField
FROM Table1
GROUP BY Field1, Field2;
Was ich möchte zu tun ist, erhalten die Schnittmenge von arrays in AggField
mit so etwas wie:
SELECT intersection(AggField) FROM View1 WHERE Field2 = 'SomeValue';
Ist, ist das überhaupt möglich, oder gibt es eine bessere Möglichkeit das zu erreichen was ich will?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist die nächste Sache zu einem array Kreuzung, die ich denken kann, ist dies:
Dies setzt Voraus, dass
a1
unda2
sind single-dimension-arrays mit der gleichen Art von Elementen. Sie wickeln konnte, dass in einer Funktion etwas wie dieses:Dann könnten Sie tun, Dinge wie diese:
Beachten Sie, dass dies nicht die Garantie einer bestimmten Reihenfolge im array zurückgegeben, aber Sie können das Problem beheben, dass, wenn Sie darum kümmern. Dann könnte man erstellen Sie Ihre eigene Aggregatfunktion:
Und jetzt sehen wir, warum wir
array_intersect
macht lustig und etwas kludgey Dinge, mit Null. Wir brauchen einen anfänglichen Wert für die aggregation verhält sich wie die universal gesetzt und wir können mit NULL für, die (ja, das riecht ein bisschen off, aber ich kann nicht an nichts denken besser aus der Spitze von meinem Kopf).Einmal alle in diesem Ort, die Sie tun können, Dinge wie diese:
Nicht ganz einfach oder effizient sein, aber vielleicht ein vernünftiger Ausgangspunkt und besser als gar nichts.
Nützliche Hinweise:
array_agg
unnest
&
)dt
verweist, dass die UNION und die "Spalte" genannte
.Akzeptiert die Antwort nicht für mich arbeiten. Dies ist, wie ich es behoben.
Es ist etwas spät um diese Frage zu beantworten, aber vielleicht wird jemand es brauchen, also habe ich beschlossen, zu teilen etwas, was ich schrieb, Ursache nicht gefunden keine fertige Lösung für die Kreuzung eine beliebige Anzahl von arrays. So ist es hier. Diese Funktion empfängt array von arrays, wenn es nur eine einzige array-Funktion liefert erste Reihe, wenn es 2 arrays, die Funktion schneidet 2 arrays und gibt das Ergebnis, wenn es mehr ist, dass 2 arrays, die Funktion nimmt Schnittpunkt der ersten 2 arrays speichert, es in eine variable und durchläuft alle anderen arrays, schneiden sich jeweils nächste array mit gespeicherten Ergebnisse und speichert das Ergebnis in variable. wenn Ergebnis ist null, es existiert null. In die-und die-variable, die speichert array mit interagierten die Daten von der Funktion zurückgegeben.
Hier ist der code für die Validierung funktioniert es.