Próby użycia struktur dynamicznych jak to zwykle oznacza, że należy używać formatów danych, jak hstore
json
, xml
, etc, które są amenible z dynamicznym dostępem.
Możesz można uzyskać uzyskać dynamiczną listę kolumn, tworząc SQL w locie w aplikacji. Możesz wysłać zapytanie do INFORMATION_SCHEMA
, aby uzyskać informacje o kolumnach tabeli i utworzyć zapytanie.
Jest możliwe, aby to zrobić w PL/PGSQL i uruchomić wygenerowanego zapytania z EXECUTE
ale znajdziesz to nieco trudne do pracy w związku z RECORD
, jak należy uzyskać i zdekodować kompozytowe krotki, nie można rozwinąć wynik ustawiony na normalną listę kolumn. Obserwuj:
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
Wszystko, co możesz zrobić, to uzyskać surowy rekord i odszyfrować go w kliencie. Nie można go indeksować za pomocą SQL, nie można go przekonwertować na nic innego itd. Większość interfejsów API klienta nie zapewnia funkcji do analizowania reprezentacji tekstowych anonimowych rekordów, więc prawdopodobnie będziesz musiał napisać to sam.
Tak więc: ty możesz zwrócić rekordy dynamiczne z PL/PgSQL bez znajomości ich typu wyniku, to nie jest po prostu użyteczne i jest to trudny do opanowania po stronie klienta. Naprawdę chcesz po prostu użyć klienta do generowania zapytań w pierwszej kolejności.
Czy próbujesz zwrócić kolumny, które zawierają w nich rok 2010, czy próbujesz zwrócić wiersze, w których konkretna kolumna ma wartość 2010? Nie możesz wybrać listy kolumn takich jak ta (cóż, być może z dynamicznym sql, jaki mógłbyś) ... – sgeddes
Czy masz kolumnę o nazwie column? –
Cóż, próbuję zwrócić kolumny z 2010 jako część ich nazwy. Na przykład są kolumny o nazwie: m01y2010 - więc chcę tego, a także: m02y2010 ... itd. - i wartości, które są w nich przechowywane kolumny. Tak więc nie ma możliwości wyboru listy kolumn z 2010 w ich nazwie !? –