返回单行,但在Postgresql中有其他列

时间:2016-11-24 02:39:38

标签: sql postgresql

我想创建一个函数,它返回一个表的一行,但是可以与其他表联系起来的一些其他列。我怎样才能做到这一点?我应该申报一个新类型吗?或者我应该返回表格类型吗?

2 个答案:

答案 0 :(得分:2)

使用RETURNS TABLE并枚举原始表格的所有列以及所有新列。

请参阅the manual

或者,您可以返回表格类型加上额外列,因此您可以生成复合类型字段,例如

RETURNS TABLE (tablerow table_type, extracol1 integer, extracol2 text)

答案 1 :(得分:1)

您无法返回表格的复合类型的值,因为这样您就无法添加其他列。

你可以:

  1. 声明包含要返回的列的新复合类型,或

  2. 返回一个没有任何固定结构的RECORD类型。在那种情况下,您将返回查询的结果行,该行提取连接到其他表的表行。

  3. 根据您提供的少量信息,记录最简单。

    请参阅:

    更新:使用记录类型进行测试后,使用起来有点不方便。考虑这个例子:

    CREATE TABLE a(id SERIAL PRIMARY KEY, foo TEXT, bar INT);
    CREATE TABLE b(id SERIAL PRIMARY KEY, aid INT, baz TEXT);
    INSERT INTO a(foo,bar) VALUES('apples', 25);
    INSERT INTO b(aid, baz) VALUES(1, 'bananas');
    
    CREATE OR REPLACE FUNCTION TEST(p_id INT) RETURNS SETOF RECORD AS $$
    BEGIN
        RETURN QUERY SELECT a.id,foo,bar,baz FROM a LEFT JOIN b ON a.id=b.aid WHERE A.ID=p_id;
    END;
    $$ LANGUAGE plpgsql;
    

    如果你天真地试图像这样使用它:

    psql=> SELECT * FROM TEST(1);
    ERROR:  a column definition list is required for functions returning "record"
    LINE 1: SELECT * FROM TEST(1);
                          ^
    

    实际上,每次要调用它时,都必须指定一个列定义列表,如下所示:

    psql=> SELECT * FROM TEST(1) AS test(id int, foo text, bar int, baz text);
     id |  foo   | bar |   baz
    ----+--------+-----+---------
      1 | apples |  25 | bananas
    (1 row)
    

    因此,如果这是您的预期用例,那么我建议您遵循Craig概述的方法。