【问题标题】:Column naming in Postgresql functionsPostgresql 函数中的列命名
【发布时间】:2011-08-25 09:43:17
【问题描述】:

我想创建一个 PSQL 函数,它返回一个类似结果的表。我的函数定义如下所示:

create or replace function myfunc1() 
   returns table(id varchar(50), title varchar(50)) 
as $$ 
begin 
   return query select id, title from books; 
end; 
$$ language plpgsql;

但是,当我调用该函数时,我得到了这个错误:

错误:列引用“id”不明确 第 1 行:从书籍中选择 id、title ^ 详细信息:它可以引用 PL/pgSQL 变量或表列。

显然,这是因为我在返回表和目标表中都使用了列名“id”。最简单的解决方案是更改列名。但我来这里是为了寻找一种让我使用我想要的列名的方法。此外,更改名称会使我的代码变得怪异,其他人难以理解。

【问题讨论】:

    标签: database function postgresql


    【解决方案1】:

    通过限定列名来消除歧义:

    create or replace function myfunc1()
      returns table(id varchar(50), title varchar(50)) as
    $$
      select books.id, books.title from books;
    $$ language sql stable;
    

    【讨论】:

    • 实际上从plpgsql切换到sql时,不需要限定列,因为sql没有plpgsql那样的命名参数,因此不会发生“名称冲突”。
    • 是的,但请参阅 pg-hackers 列表上最近的讨论:Pavel,如果没记错的话,建议了一个补丁来介绍它们(而其他一些核心开发人员对这个想法非常敌视)。 :-D
    【解决方案2】:

    SELECT books.id, title FROM books?

    【讨论】:

      【解决方案3】:

      函数定义中的... returns table(id varchar(50), title varchar(50)) ... 部分就是another way to define OUT parameters。因此,现在您有两个名为 idtitle 的 OUT 参数和两列(来自 book 表),您指的是命名...是的,您猜对了 - idtitle

      避免这种歧义的一种方法是在函数定义中重命名返回表的列名:

      CREATE OR REPLACE FUNCTION myfunc1() RETURNS TABLE(p_id VARCHAR(50), p_title VARCHAR(50)) AS $_$
      BEGIN
        RETURN QUERY SELECT id, title FROM books;
      END;
      $_$ LANGUAGE plpgsql;
      

      【讨论】:

        猜你喜欢
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 2014-02-20
        • 2019-08-14
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多