sql >> Database >  >> RDS >> PostgreSQL

Hoe krijg ik individuele kolommen uit de tabel die worden geretourneerd door een functie?

Om de rijen die u terugkrijgt van de functie te ontleden, behandelt u deze als elke andere tabel:

SELECT * FROM karta_pacjenta('foo45678901');

Functies die een reeks rijen retourneren, worden ook "tabelfuncties" genoemd.

Afgezien daarvan zou wat je presenteerde niet werken.

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;
  • Enkele aanhalingstekens voor kolomnamen zijn een syntaxisfout. Zouden dubbele aanhalingstekens moeten zijn. Het is echter beter om altijd niet-geciteerde, legale namen in kleine letters te gebruiken.

  • Citeer de taalnaam niet, het is een identificatie.

De rest is optioneel, maar goed advies.

  • Een eenvoudige SQL-functie doet het werk hier.

  • Gebruik expliciete JOIN-syntaxis. Hetzelfde resultaat, maar veel gemakkelijker te onderhouden.

  • Het is waarschijnlijk zinloos om varchar(11) . te gebruiken in plaats van alleen varchar of text als paramtype. (Uitzonderingen voor hoekgevallen zijn van toepassing.)

  • Gebruik citaten in dollars - wat hier volledig optioneel is, maar over het algemeen een goede stijl om de functietekst te citeren. Vroeg of laat wil je enkele aanhalingstekens in de hoofdtekst opnemen.




  1. MYSQL Hoe maak ik een aangepast maandverschil tussen twee datums in MYSQL?

  2. Hoe TO_SECONDS() werkt in MariaDB

  3. Php - MySQL selecteert gegevens uit tabel en werkt vervolgens dezelfde tabel bij

  4. Tabellen maskeren en referentiële integriteit behouden?