【问题标题】:Return variable in postgres select在 postgres 选择中返回变量
【发布时间】:2021-01-16 12:32:33
【问题描述】:

这涵盖了大多数用例How do you use variables in a simple PostgreSQL script?,但不包括 select 子句。

此代码产生错误column "ct" does not exist"

DO
$$

declare CT timestamp := '2020-09-04 23:59:59';

select CT,5 from job;

$$;

我明白为什么它将 CT 解释为列名。在 select 子句的上下文中引用变量所需的 Postgres 语法是什么?

我希望该查询返回

'2020-09-04 23:59:59',5

作业表中的每一行。


已接受答案的附录

我的用例不返回行。相反,选择的结果由插入语句使用。我正在将暂存表中的行转换为其他表,并添加导入日期和拥有插入的身份等值。变量提供的正是这些值——它们被用在几个这样的转换中,变量的重点是让我在脚本顶部设置每个值。

因为这些行是这样消耗的,所以我不需要包装此代码的函数。测试有点不方便,因为我无法运行选择并查看结果而不复制并粘贴文字,但至少可以使用变量。我的工作脚本如下所示:

do
$$
declare ct timestamp := '2020-09-04 23:59:59';
declare cb int := 2;
declare iso8601 varchar(50) := 'YYYY-MM-DD HH24:MI:SS';
declare USAdate varchar(50) := 'MM-DD-YYYY HH24:MI:SS';
begin

delete from dozer_wheel_loader_equipment_movement where created = ct;
INSERT INTO dozer_wheel_loader_equipment_movement 
(site, primary_category_id, machine, machine_class, x, y, z, timestamp_local, created, created_by)
select site ,mc.id ,machine , machineclass ,x,y,z,to_timestamp(timestamplocal, iso8601), ct, cb 
from stage_dozer_csv d join machine_category mc on d.primarycategory = mc.short_code;
...
end
$$

How to declare a variable in a PostgreSQL query有很多值得一读的相关资料

【问题讨论】:

  • 您没有收到SQL Error [42702]: ERROR: column reference "CT" is ambiguous 错误消息吗?我不认为你可以解决这个问题。在变量名称前加上前缀,例如 var_ct,然后 select var_ct, 5 from job; 会给你想要的结果。顺便说一句,您的 pl/pgsql 块无效。
  • declare 启动一个 block 进行声明。它只需要一次。为每个变量创建一个新的declare 块效率低且不需要。

标签: postgresql


【解决方案1】:

PostgreSQL 中关于变量的东西很少。

变量不能在 Postgres 的普通 SQL 中使用。所以你必须使用任何 pl 语言,即plpgsql 才能使用它。你已经在你的例子中尝试了同样的方法。

在你的DO 块中你错过了BeginEnd,所以你必须像下面这样写

DO
$$
begin
declare CT timestamp := '2020-09-04 23:59:59';
select CT,5 from job;
end
$$;

但是当你阅读DO声明的官方文档时,它说DO将允许运行匿名代码但它返回void,这就是为什么上面的代码会抛出以下错误:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function inline_code_block line 4 at SQL statement

所以只有一种方法 - 将此代码块包装在 Function 中,如下所示:

create or replace function func() returns table(col1 timestamp, col2 int )
AS
$$
declare ct timestamp := '2020-09-04 23:59:59';
begin
return query
select CT,5 from job;
end;
$$
language plpgsql

你可以这样称呼它:

select * from func()

DEMO

结论

  1. 您不能在 Postgres 的普通 SQL 语句中使用variable
  2. 您必须使用任何过程语言,即plpgsql 才能使用变量。
  3. DO 块不返回任何值,因此您不能在 DO 块中使用上面的 select 语句。它适用于非返回查询,即insertupdatedeletegrant 等。
  4. 从过程语言代码块返回值的唯一方法是 - 您必须将其包装在合适的 PostgreSQL 函数中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2015-12-13
    • 2019-08-09
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多