Przechowuj dane wyjściowe zapytania wybierającego w jednej tablicy w postgres

86

Mój kod to:

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

Zwraca nazwy kolumn tabeli aean.
Teraz zadeklarowałem tablicę:

DECLARE colnames text[]

Jak mogę przechowywać dane wyjściowe select w tablicy colnames.
Czy istnieje potrzeba inicjowania nazw kolumn?

mitesh
źródło
+1, dotarłem tutaj z dokładnie tym samym komunikatem o błędzie - BŁĄD: nie można znaleźć typu tablicy dla typu danych information_schema.sql_identifier. Próbowałem zarray_agg(column_name, ',')
jerrymouse

Odpowiedzi:

150

Istnieją dwa sposoby. Jedna to agregacja:

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

Drugim jest użycie konstruktora tablicy:

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

Przypuszczam, że to jest dla plpgsql. W takim przypadku możesz to przypisać w ten sposób:

colnames := ARRAY(
SELECT column_name
FROM information.schema.columns
WHERE table_name='aean'
);
Denis de Bernardy
źródło
czy możesz mi podać kod, który działa na postgres, ponieważ to nie działa na postgres BŁĄD: nie można znaleźć typu tablicy dla typu danych information_schema.sql_identifier
mitesh
Przepraszam za to. Bezmyślne kopiowanie i wklejanie otrzymało funkcję array_agg () we wszystkich trzech wywołaniach. Utworzyłem też pierwszą wersję, aby Twoja wersja PG była szczęśliwa.
Denis de Bernardy
9
Dla każdego, kto szuka dalej części plpgsql, możesz utworzyć DECLAREtablicę as my_array INTEGER[];(lub jakikolwiek inny odpowiedni typ). Możesz również użyć tablicy w WHEREklauzuli zapytania, takiej jak WHERE values = ANY(my_array). ANYPobiera tablicę lub zestaw i sprawdza obecność w tej tablicy / set, więc to działa równoważnie do IN ()w pewnym sensie
user2490003
11

Miałem dokładnie ten sam problem. Jeszcze jedna działająca modyfikacja rozwiązania podanego przez Denisa (należy określić typ):

SELECT ARRAY(
SELECT column_name::text
FROM information_schema.columns
WHERE table_name='aean'
)
ptski
źródło
1
Wygląda na to, że już tak nie jest.
Soviut,