gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:02:51 26 4
gpt4 key购买 nike

我正在尝试将“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 .. 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;

您还应该避免使用带引号的标识符。从长远来看,它们带来的麻烦多于它们的值(value)。只需在不引用列名的情况下创建您的表。

关于postgresql - 如何将 SELECT 语句分配给变量并使用 PostgreSQL 执行该变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24205983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com