PostgreSQL v9.X echte "array of record"?
Diese Abfrage funktioniert einwandfrei,
WITH test AS (
SELECT array_agg(t) as x FROM (
SELECT 1111 as id, 'aaaaa' as cc
) AS t
) SELECT x[1] FROM test;
aber, kann ich auf die recod Elemente? Ich versuche SELECT x[1].id
; SELECT x[1][1]
; ... nichts funktioniert.
PS: mit Google sehen wir nur die ALTEN Lösungen... Der Rahmen hier ist v9.X, keine Nachrichten über "array of record"?
Ich versuche auch
select x[1] from (select array[row(1,2)] as x) as t;
keine Lösung, nur den Zugriff auf Artikel 1 oder nur Punkt 2.
Ahnung, dass ich nicht in der Lage war zu Folgen: postgresql.1045698.n5.nabble.com lösen das problem mit einer CREATE TYPE
... Ok, aber ich brauche "alle in einer Abfrage" - Lösung. Wo die "dynamische Typisierung" von PostgreSQL?? Wie GUSS-oder express-der Typ ohne CREATE TYPE
- Klausel?
- Sie können konvertieren Sie den Wert
hstore
packe und Felder, draus das so, aber das ist nicht wirklich das, was Sie wollen. PostgreSQL istrecord
pseudo-Typ ist ein bisschen eingeschränkt - insbesondere, es gibt keine anonymen Datensatz cast, z.B.CAST(somerecord AS t(x integer, y text))
funktioniert nicht. - BTW, ist dies etwas, was Sie wollen, werden Sie brauchen, um Lärm zu machen über Sie, und vermutlich, dass der Lärm mit der Bereitschaft zu tun, echte Arbeit und/oder dazu beitragen dev Zeit. Es ist ein bisschen von einer Ecke des Typ-system, und keiner ist wirklich scharf auf daran zu arbeiten, so müssen Sie kümmern sich genug, es zu schaffen, sich selbst, oder finden Sie Wege, um andere zu sorgen genug, um mit Ihr umzugehen.
- Hast du mehr Kontext dazu? Es könnte einen anderen Weg zu bekommen, wo Sie sein müssen.
- Sorry @Mu, wir brauchen nicht "mehr Kontext", ist ein syntatic Widerspruch von PostgreSQL... ich denke, dass Craig bestätigt meine Täuschung mit pg9.X: keine Neuigkeiten.
- Danke @CraigRinger, Sie verstehen meine Täuschungen, und zeigen eine bessere Namen: "anonyme Datensatz cast" ist die "syntax Mangel" von PG. Das war es, was ich Suche, beim Aufbau dieser Art von Abfragen. PostgreSQL ermöglicht es ausdrückt, "etwas, das scheint Array von Recortd" aber uns enttäuschen, auf dem halben Weg... ja, ich brauche, um Lärm über viele kleine Dinge, aber vielleicht der erste Krach ist "Hallo PG-Community! Wir sind in 2014! Wo die RFC-Website? Wo die Schnittstelle für den Stakeholder zu wählen!??"
- Es ist open-source. Bist du ein stakeholder, wenn Sie dazu beitragen - werden, die helfen, die Menschen auf die Listen oder hier, das detaillierte design, die bug-Jagd und-reporting, bug-fixing, code-Bereinigungen, feature-Beiträge, patch review, etc etc. Ich schlage vor, sich einzubringen und einen Beitrag, wenn Sie möchten, um gehört zu werden. (Auch, bitte sagen Sie nicht "9.x" - 9.0, 9.1, 9.2, ... sind alle major releases. Ja, das ist dumm, aber wir sind dabei geblieben). Sie interessieren sich für diese Sache - andere Pflege über die bidirektionale Replikation, andere über row-level-security und multi-tenant -, ... . Lärm machen, hören, beitragen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Derzeit nicht zu sein scheinen keine syntax für den Zugriff auf einen Datensatz der anonyme Typ, ausser über die Funktionsaufruf-syntax oder über hstore. Das ist bedauerlich, aber wahrscheinlich nicht beseitigt werden, in Eile, es sei denn, jemand, der sich wirklich interessiert, kommt um Sie geschehen. Es gibt andere Prioritäten.
Haben Sie drei Möglichkeit zur Problemumgehung:
CREATE TYPE
hstore
CREATE TYPE
Das Problem mit den Aufzeichnungen der anonymen Typs. Also, machen Sie es nicht anonym ist. Leider ist dies nur möglich, bevor es zu einer anonymen Datensatz-Art; Sie kann momentan nicht gewirkt
record
zu einem usertype. So müssten Sie tun:Hinweis: die Besetzung der Unterabfrage Ausgabe
some_t
vor der aggregation.Ich kann nicht sagen, dass ich verstehe, warum diese Form nicht mehr durchgeführt werden können, nachdem die Indizierung der Arrays statt.
hstore
Wie üblich
hstore
Fahrten zu den meist-Rettung mit schwierigen Probleme geben.Müssen Sie die
hstore
Erweiterung, und ich bin sicher, es ist nicht effizient, aber es funktioniert. Diese baut auf denhstore
Unterstützung für die Erstellung einer hstore von anonymen Datensätzen, die Hinzugefügt wurde, zu unterstützenNEW
undOLD
im Trigger, eine Vergangenheit, Schmerz-Punkt.Wrapper-Funktion?
Stellt sich heraus, Sie können nicht bekommen, um es mit einem einfachen wrapper-Funktion lassen Sie den Typ angeben, die auf der call-Seite:
also müsstest du eine höhere overhead-prozedurale Sprache, an welcher Stelle könnten Sie genauso gut verwenden hstore statt, es werden schneller und leichter.
Besser zu machen?
Also, das ist alles ein bisschen hässlich. Es ist nicht wahrscheinlich jemals möglich sein, direkt indizieren Sie ein Feld von einem anonymen Datensatz, da es möglicherweise nicht existiert und dessen Typ nicht abgeleitet werden kann. Es gibt aber keinen Grund, wir können nicht die Art system-Funktion, die ermöglicht es uns zurück
record
aus einer Funktion und geben Sie seinen Typ auf der Anrufer-Seite, um dies auch in wirft.Sollte es möglich sein, um die Unterstützung für PostgreSQL etwas wie:
würd es nur auf die entsprechende parser-hacking, und ein Weg, um sicherzustellen, dass war nie zweideutig analysiert in Konflikt mit einer Spalten-alias.
Wirklich, auch Typ-Inferenz möglich sein könnte, wenn jemand bereit war, die Arbeit in und überzeugen das team, dass die verhältnismäßig große Menge von query-planner-Prozessor benötigte Zeit war es Wert. (unwahrscheinlich).
Dies ist eine irritierende, aber kleinere, die Ecke in das Typ-system. Wenn Sie möchten, es zu ändern, müssen Sie Lärm machen, auf pgsql-general, und begleiten, dass der Lärm mit der Bereitschaft zu tun, echte Arbeit zu verbessern das problem. Dies kann bedeuten, das lernen mehr als Sie jemals wissen wollte über die Innereien der PostgreSQL-Datentyp system, lernen, Spaß "rückwärts-Kompatibilität", und frustrierend Argumente rund um und im Kreis herum. Willkommen auf open-source!