PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie erhalte ich einzelne Spalten aus einer Tabelle, die von einer Funktion zurückgegeben werden?

Um die Zeilen, die Sie von der Funktion zurückerhalten, zu zerlegen, behandeln Sie sie wie jede andere Tabelle:

SELECT * FROM karta_pacjenta('foo45678901');

Funktionen, die eine Reihe von Zeilen zurückgeben, werden auch "Tabellenfunktionen" genannt.

Abgesehen davon würde das, was Sie präsentiert haben, nicht funktionieren.

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;
  • Einfache Anführungszeichen für Spaltennamen sind ein Syntaxfehler. Müssten doppelte Anführungszeichen sein. Verwenden Sie jedoch besser immer nicht in Anführungszeichen gesetzte, legale Namen in Kleinbuchstaben.

  • Geben Sie den Sprachnamen nicht in Anführungszeichen, er ist eine Kennung.

Der Rest ist optional, aber ein guter Ratschlag.

  • Eine einfache SQL-Funktion erledigt hier die Arbeit.

  • Verwenden Sie die explizite JOIN-Syntax. Gleiches Ergebnis, aber viel einfacher zu warten.

  • Es ist wahrscheinlich sinnlos, varchar(11) zu verwenden statt nur varchar oder text als Parametertyp. (Es gelten Ausnahmen für Eckfälle.)

  • Verwenden Sie Dollar-Quotes - was hier völlig optional ist, aber im Allgemeinen ein guter Stil ist, um den Funktionskörper zu zitieren. Früher oder später werden Sie einfache Anführungszeichen in den Text einfügen wollen.