Versuche, dynamische Strukturen wie diese zu verwenden, weisen normalerweise darauf hin, dass Sie Datenformate wie hstore
, json
, xml
usw. verwenden sollten, die für dynamischen Zugriff zugänglich sind.
Sie können erhalten Sie eine dynamische Spaltenliste durch Erstellen der SQL im laufenden Betrieb in Ihrer Anwendung. Sie können die INFORMATION_SCHEMA
abfragen, um Informationen zu den Spalten einer Tabelle abzurufen und die Abfrage zu erstellen.
Es ist möglich, dies in PL/PgSQL zu tun, und die erzeugte Abfrage mit EXECUTE
laufen, aber Sie finden es etwas schwierig RECORD
mit dem Ergebnis, zu arbeiten, wie Sie Composite-Tupel erhalten und entschlüsseln müssen Sie das nicht erweitern Ergebnis wird in eine normale Spaltenliste gesetzt. Beobachten:
craig=> CREATE OR REPLACE FUNCTION retrecset() returns setof record as $$
values (1,2,3,4), (10,11,12,13);
$$ language sql;
craig=> select retrecset();
retrecset
---------------
(1,2,3,4)
(10,11,12,13)
(2 rows)
craig=> select * from retrecset();
ERROR: a column definition list is required for functions returning "record"
craig=> select (r).* FROM (select retrecset()) AS x(r);
ERROR: record type has not been registered
Über alles, was Sie tun können, ist die rohe Aufzeichnung und entschlüsseln Sie es im Client. Sie können es nicht von SQL aus indizieren, Sie können es nicht in etwas anderes konvertieren usw. Die meisten Client-APIs bieten keine Möglichkeiten zum Parsen der Textdarstellungen anonymer Datensätze, so dass Sie diese wahrscheinlich selbst schreiben müssen.
Also: Sie können dynamische Datensätze von PL/PgSQL zurückgeben, ohne zu wissen, ihre Ergebnisart, es ist nur nicht besonders nützlich, und es ist ein Schmerz, auf der Clientseite zu behandeln. Sie möchten wirklich nur den Client verwenden, um Abfragen in erster Linie zu generieren.
Versuchen Sie, Spalten zurückzugeben, die 2010 in ihnen enthalten, oder versuchen Sie Zeilen zurückzugeben, wo eine bestimmte Spalte den Wert 2010 enthalten hat? Sie können nicht eine Liste von Spalten so wählen (gut, vielleicht mit dynamischem sql konnten Sie) ... – sgeddes
Haben Sie eine Spalte Spalte genannt? –
Nun, ich versuche Spalten mit 2010 als Teil ihres Namens zurückzugeben. Zum Beispiel gibt es Spalten mit dem Namen: m01y2010 - so will ich das, sowie: m02y2010 ... usw. - und Werte, die in ihnen Spalten gespeichert sind. Es gibt also keine Möglichkeit, eine Liste von Spalten mit 2010 in ihrem Namen auszuwählen !? –