Postgresql函数中的列命名

时间:2011-05-14 06:29:45

标签: database function postgresql

我想创建一个PSQL函数,它返回一个像result的表。我的函数定义如下所示:

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,标题                  ^   DETAIL:它可以引用PL / pgSQL变量或表列。

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

SELECT books.id, title FROM books

答案 2 :(得分:0)

函数定义的... 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;