sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur får man tillbaka enskilda kolumner från tabellen från en funktion?

För att dekomponera raderna du får tillbaka från funktionen behandla den som vilken annan tabell som helst:

SELECT * FROM karta_pacjenta('foo45678901');

Funktioner som returnerar en uppsättning rader kallas också "tabellfunktioner".

Bortsett från det skulle det du presenterade inte fungera.

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;
  • Enstaka citattecken för kolumnnamn är ett syntaxfel. Måste vara dubbla citattecken. Det är bättre att du alltid använder namn utan citat, lagliga, gemener.

  • Citera inte språknamnet, det är en identifierare.

Resten är valfritt, men bra råd.

  • En enkel SQL-funktion gör jobbet här.

  • Använd explicit JOIN-syntax. Samma resultat, men mycket lättare att underhålla.

  • Det är förmodligen meningslöst att använda varchar(11) istället för bara varchar eller text som paramtyp. (Undantag från hörnfall gäller.)

  • Använd dollar-citering - vilket är helt valfritt här, men generellt bra stil för att citera funktionskroppen. Förr eller senare vill du inkludera enstaka citattecken i brödtexten.




  1. PostgreSQL:ordning efter kolumn, med specifikt NON-NULL-värde LAST

  2. Det bästa sättet för PHP Caching

  3. Hur infogar man JSONB i Postgresql med Python?

  4. Behöver du hjälp med att skapa en enkel reskontra från mysql skuld- och kredittabeller?