在Postgresql中返回一行但包含其他列

在Postgresql中返回一行但包含其他列,sql,postgresql,Sql,Postgresql,我想创建一个函数,它返回一个表的一行,但可以与其他表中的一些附加列连接。我该怎么做?我应该声明一个新类型吗?还是应该返回表类型?使用返回表并枚举原始表的所有列以及所有新列 看 或者,您也可以返回表类型加上额外的列,从而生成复合类型字段,例如 RETURNS TABLE (tablerow table_type, extracol1 integer, extracol2 text) 不能返回表的复合类型的值,因为这样就无法添加其他列 你可以: 声明包含要返回的列的新复合类型,或 返回没有任何固定

我想创建一个函数,它返回一个表的一行,但可以与其他表中的一些附加列连接。我该怎么做?我应该声明一个新类型吗?还是应该返回表类型?

使用
返回表
并枚举原始表的所有列以及所有新列

或者,您也可以返回表类型加上额外的列,从而生成复合类型字段,例如

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

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

你可以:

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

  • 返回没有任何固定结构的记录类型。在这种情况下,您将返回查询的结果行,该查询提取了与其他表关联的表的行

  • 基于您提供的少量信息,记录将是最简单的

    见:

    更新:在使用记录类型进行测试后,结果发现它们使用起来有些不方便。考虑这个例子:

    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)
    
    实际上,每次要调用它时,都必须指定一个列定义列表,如下所示:

    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)
    

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

    您可以更好地解释您的问题,向我们展示您的尝试。请阅读,这里是一个学习如何提高你的问题质量和获得更好答案的好地方。@JuanCarlosOropeza,什么不清楚?不清楚,你也没有表现出任何努力,即使你知道一些关于新类型和表格类型的知识。看来这是个懒惰的问题。@JuanCarlosOropeza,什么努力?这里没有什么可展示的。我的意思是你没有展示你尝试过的东西。这不是
    do it for me
    站点。你尝试了一些事情,陷入困境,寻求帮助,我们会教你什么是错的。