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

如何将SELECT语句分配给变量并使用PostgreSQL执行该变量,postgresql,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 FR

我试图将“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语句提供正确的单引号并执行它?

我假设您并不真正想要一个
select。。变成因为这是
创建表作为选择的非标准(过时、历史)语法

当您将函数声明为“返回记录集”时,我假设您实际上想要返回一个结果集。最好使用
返回表(…)
,因为这样函数的使用就更容易了

最后,我看不出这里使用动态SQL的原因,但我假设您没有告诉我们全部情况

以下各项应有效(未经测试):

这假设
Name
Address
都是
varchar
text
列。如果不是,则需要调整
返回表(文本,文本)
部分

但鉴于您的示例,不需要动态SQL,甚至不需要PL/pgSQL,一个简单的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;
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;