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?


+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'
);

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'
)

1
Wygląda na to, że już tak nie jest.
Soviut,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.