1

Temat: Wyliczana nazwa kolumny w zapytaniach

Witam,

Czy wiecie może jak stworzyć zapytanie, w którym nazwy kolumn będą zmienne (wyliczane)?
Dokładnie chciałbym uzyskać taki efekt, aby wykonując zapytanie w tygodniu 45, jedna z kolumn nazywała się właśnie '45', Jeżeli to samo (niezmodyfikowane) zapytanie wykonam w tygodniu 50, kolumna powinna nazywać się '50'.

Pozdrawiam
Darek

2

Odp: Wyliczana nazwa kolumny w zapytaniach

Ale rozumiem że chodzi o 'wyliczanie' nazw kolumn na bazie (nie chcesz chyba zmieniać fizycznie nazw kolumn na bazie), tylko aliasów które wypisujesz poleceniem select tak?

3

Odp: Wyliczana nazwa kolumny w zapytaniach

Tak, dokładnie tak.
Nie chcę zmieniać nazw kolumn na bazie. To alias ma być zmienny (w moim przypadku zależny od tygodnia)
Oczywiście, mogę po stronie aplikacji wyliczyć aliasy i złożyć select,a, ale chciałbym, żeby to baza dbała o te nazwy a aplikacja pytała: select * from .....

4

Odp: Wyliczana nazwa kolumny w zapytaniach

Moze da sie to zrobic przez utworzenie widoku i odpytywanie go.
Bardzo prawdopodobne, że można to rozwiązać poprzez utworzenie na bazie funkcji i odpytywanie jej.

5

Odp: Wyliczana nazwa kolumny w zapytaniach

Właśnie mam nadzieję, że może się da wink
Próbowałem już wielu rzeczy, łącznie z funkcjami. Żeby zwracać rekordy poprzez funkcje w jej deklaracji trzeba podać typ zwracanych rekordów (... RETURNS SETOF ... ) gdzie podawałem nazwę widoku, który definiował pola. Problem polega na tym, że funkcja taka zwraca dane z takimi nazwami kolumn jakie są w widoku definiującym dane. Nie znalazłem metody na to, żeby te aliasy podmieniać hmm

6

Odp: Wyliczana nazwa kolumny w zapytaniach

Można to zrobić na kilka sposobów.

Pierwszy jaki mi przychodzi do głowy i najłatwiejszy, to funkcje i refcursory.
Refcursor nabiera kształtu podczas wykonywania danych, zatem nie trzeba mu deklarować odpowiedniej struktury.

Wyglądać to może tak

merlin=# BEGIN;
BEGIN
merlin=# SELECT * FROM nr_tygodnia(49, 'cursorek');   cur    
----------
 cursorek
(1 row)

merlin=# fetch all from cursorek;
     49    
------------
 2009-11-30
 2009-12-01
 2009-12-02
 2009-12-03
 2009-12-04
 2009-12-05
 2009-12-06
(7 rows)

merlin=# END;
COMMIT

i funkcja (klępnięta na szybko)

CREATE  OR REPLACE FUNCTION nr_tygodnia(IN arg1 integer, IN OUT cur refcursor) RETURNS refcursor AS
$BODY$declare
nrtg int;
begin
    SELECT EXTRACT(week FROM NOW()) INTO nrtg;
    OPEN cur FOR EXECUTE 'SELECT current_date+gs.a as "'||nrtg||'"
                            FROM generate_series(0,10) as gs(a) 
                           WHERE EXTRACT(week FROM current_date + gs.a)='||arg1;
    return;
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Plusy:
- nie dajesz developerom dostępu do pure sqla, dostają tylko funkcje która ma w sobie mega optymalne zapytanie tongue

- jako programista bazodanowy ty optymalizujesz zapytania i masz władze nad zapytaniami do bazy
i nie masz obawy ze bokiem idzie jakieś analityczne zapytanie :]


Minusy:
- to parametryzowanie funkcji, które trzeba wołać w transakcji (bo gdyż na przestrzeni danej transakcji będzie istniał Twój nazwany kursor)

Ostatnio edytowany przez psocha (2009-11-30 21:12:44)

Pozdrawiam
Pawel Socha