【问题标题】:How to get individual columns from table returned from a function?如何从函数返回的表中获取单个列?
【发布时间】:2015-03-24 03:21:30
【问题描述】:

我正在尝试使用返回表创建一个函数。

CREATE  FUNCTION karta_pacjenta(pe VARCHAR(11))
  RETURNS TABLE('data' DATE,'imie' TEXT, 'nazwisko' TEXT, 'diagnoza' TEXT,'przepisany lek' TEXT)  AS'  
BEGIN
 RETURN QUERY SELECT w.dzien AS dzien,p.imie, p.nazwisko, ch.nazwa, l.nazwa
 FROM pacjenci p, diagnozy d, choroby ch, wizyty w, leki l, recepty r
 WHERE p.pesel=d.pesel AND d.kod_choroby=ch.kod_choroby AND p.pesel=pe AND w.pesel=pe AND l.kod_leku=r.kod_leku AND r.nr_wizyty=w.nr_wizyty;
END;
' LANGUAGE 'plpgsql';

效果很好,但我还需要一件事。作为这个函数的结果,我得到了函数名,然后是几条记录。

但是,我想在记录上加上列名。知道怎么做吗?

【问题讨论】:

    标签: database postgresql function rows plpgsql


    【解决方案1】:

    要分解从函数返回的行,请将其视为任何其他表:

    SELECT <b>* FROM</b> karta_pacjenta('foo45678901');

    返回一组行的函数也称为“表函数”。


    除此之外,您提供的内容也行不通。

    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;
    
    • 列名的单引号是语法错误。必须是双引号。不过,最好始终使用不带引号的合法小写名称。

    • 不要引用语言名称,它是一个标识符。

    其余的都是可选的,但建议很好。

    • 这里有一个简单的 SQL 函数。

    • 使用显式 JOIN 语法。结果相同,但更容易维护。

    • 使用varchar(11) 而不仅仅是varchartext 作为参数类型可能毫无意义。 (适用特殊情况。)

    • 使用美元引用 - 这里完全是可选的,但通常是引用函数体的好风格。迟早你会想要在正文中包含单引号。

    【讨论】:

      猜你喜欢
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      相关资源
      最近更新 更多