Speichern Sie die Ausgabe der ausgewählten Abfrage in einem Array in Postgres

86

Mein Code lautet:

SELECT column_name
FROM information.SCHEMA.columns
WHERE table_name = 'aean'

Es werden Spaltennamen der Tabelle zurückgegeben aean.
Jetzt habe ich ein Array deklariert:

DECLARE colnames text[]

Wie kann ich die Ausgabe von select im Spaltennamen-Array speichern?
Müssen Spaltennamen initialisiert werden?

Mitesh
quelle
+1, ich habe hier mit genau der gleichen Fehlermeldung erreicht - FEHLER: Array-Typ für Datentyp information_schema.sql_identifier konnte nicht gefunden werden. array_agg(column_name, ',')
Versuchte

Antworten:

150

Es gibt zwei Möglichkeiten. Eine ist zu aggregieren:

SELECT array_agg(column_name::TEXT)
FROM information.schema.columns
WHERE table_name = 'aean'

Die andere Möglichkeit besteht darin, einen Array-Konstruktor zu verwenden:

SELECT ARRAY(
SELECT column_name 
FROM information.schema.columns 
WHERE table_name = 'aean')

Ich gehe davon aus, dass dies für plpgsql ist. In diesem Fall können Sie es folgendermaßen zuweisen:

colnames := ARRAY(
SELECT column_name
FROM information.schema.columns
WHERE table_name='aean'
);
Denis de Bernardy
quelle
Können Sie mir den Code geben, der auf Postgres funktioniert, weil dies auf Postgres nicht funktioniert? FEHLER: Array-Typ für Datentyp konnte nicht gefunden werden information_schema.sql_identifier
Mitesh
Tut mir leid. Beim sinnlosen Kopieren und Einfügen war array_agg () in allen drei Aufrufen enthalten. Ich habe auch die erste typisiert, um Ihre PG-Version glücklich zu machen.
Denis de Bernardy
9
Für alle, die weiter auf den plpgsql-Teil schauen, können Sie DECLAREein Array als my_array INTEGER[];(oder was auch immer der relevante Typ ist) verwenden. Sie können das Array auch in einer Abfrageklausel WHEREwie verwenden WHERE values = ANY(my_array). Der ANYnimmt ein Array oder einen Satz und prüft, ob er in diesem Array / Satz vorhanden ist, sodass er IN ()in
gewissem
11

Ich hatte genau das gleiche Problem. Nur noch eine funktionierende Modifikation der von Denis angegebenen Lösung (der Typ muss angegeben werden):

SELECT ARRAY(
SELECT column_name::text
FROM information_schema.columns
WHERE table_name='aean'
)
ptski
quelle
1
Dies scheint nicht mehr der Fall zu sein.
Soviut