PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come ottenere singole colonne dalla tabella restituite da una funzione?

Per scomporre le righe che ottieni dalla funzione trattala come qualsiasi altra tabella:

SELECT * FROM karta_pacjenta('foo45678901');

Le funzioni che restituiscono un insieme di righe sono anche chiamate "funzioni di tabella".

A parte questo, quello che hai presentato non funzionerebbe.

CREATE  FUNCTION karta_pacjenta(_pe varchar)
  RETURNS TABLE(data DATE, imie TEXT, nazwisko TEXT
              , diagnoza TEXT,przepisany lek TEXT)  AS
$func$
SELECT w.dzien, p.imie, p.nazwisko, ch.nazwa, l.nazwa
FROM   pacjenci  p
JOIN   diagnozy  d  USING (pesel) -- shorthand if columns are unambiguous
JOIN   wizyty    w  USING (pesel)
JOIN   choroby   ch ON ch.kod_choroby = d.kod_choroby
JOIN   recepty   r  ON r.nr_wizyty = w.nr_wizyty
JOIN   leki      l  ON l.kod_leku = r.kod_leku 
WHERE  p.pesel = _pe
$func$ LANGUAGE sql;
  • Le virgolette singole per i nomi delle colonne sono un errore di sintassi. Dovrebbero essere virgolette doppie. È meglio usare sempre nomi non quotati, legali e minuscoli, però.

  • Non citare il nome della lingua, è un identificatore.

Il resto è facoltativo, ma un buon consiglio.

  • Una semplice funzione SQL fa il lavoro qui.

  • Usa la sintassi JOIN esplicita. Stesso risultato, ma molto più facile da mantenere.

  • Probabilmente è inutile usare varchar(11) invece di solo varchar o text come tipo di parametro. (Si applicano eccezioni ai casi d'angolo.)

  • Usa la citazione del dollaro, che è totalmente facoltativa qui, ma generalmente è un buon stile per citare il corpo della funzione. Prima o poi vorrai includere virgolette singole nel corpo.