如何将SELECT语句分配给变量并使用PostgreSQL执行该变量

时间:2014-06-13 13:01:24

标签: postgresql

我正在尝试分配" SELECT"查询变量,然后想要执行该变量并显示结果,但在引用单引号时卡住了。

示例

 create or replace function test() returns setof record as
 $BODY$
 Declare
      query1 varchar;
 Begin

      query1 := SELECT DISTINCT c."Name", c."Address"
            INTO  temptable
        FROM table1 l
        INNER JOIN tablename c on l."Name" = c."Name"
        ORDER BY "Name";

  /* Here need to execute query1 and get result of it */
 end;
 $BODY$
 language plpgsql;

问题:如何为select语句提供正确的单引号并执行它?

1 个答案:

答案 0 :(得分:2)

我认为您并不真正想要select .. into ... ...,因为这是create table as select的非标准(过时的,历史性的)语法。

当您将函数声明为returns setof record时,我假设您确实想要返回结果集。最好使用returns table (...),因为这样功能的使用更容易。

最后,我在这里看不到动态SQL的原因,但我认为你根本没有告诉我们整个故事。

以下内容应该有效(未经测试):

create or replace function test() 
   returns table (name text, address text)
as
 $BODY$
 Declare
      query1 varchar;
 Begin
    query1 := 'SELECT DISTINCT c."Name", c."Address"
        FROM table1 l
        INNER JOIN tablename c on l."Name" = c."Name"
        ORDER BY "Name"';

    return query execute query1;
 end;
 $BODY$
 language plpgsql;

这假定NameAddress都是varchartext列。如果不是,则需要调整returns table (text, text)部分。

但是考虑到你的例子,不需要动态SQL甚至PL / pgSQL,一个简单的SQL函数就可以了(而且通常会快得多):

create or replace function test() 
   returns table (name text, address text)
as
$body$
 SELECT DISTINCT c."Name", c."Address"
 FROM table1 l
   INNER JOIN tablename c on l."Name" = c."Name"
 ORDER BY "Name"';
$body$
language sql;

您还应该避免使用带引号的标识符。从长远来看,它们比它们的价值更麻烦。只需创建表而不引用列名。