我正在尝试分配" 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语句提供正确的单引号并执行它?
答案 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;
这假定Name
和Address
都是varchar
或text
列。如果不是,则需要调整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;
您还应该避免使用带引号的标识符。从长远来看,它们比它们的价值更麻烦。只需创建表而不引用列名。