DECLARE
    total1 float;
    total2 float;
  
  SELECT
      SUM(CASE WHEN totals.valid = 0 THEN amount ELSE 0 END),
      SUM(CASE WHEN totals.valid <> 0 THEN amount ELSE 0 END)
      INTO total1, total2
  FROM
    totals;

在这里,Postgres通知我我的条件语法中有一个错误:

ERROR:  42601: syntax error at end of input

LINE 12:       SUM(CASE WHEN totals.valid = 0 THEN amount ELSE 0 END),

                                          ^

CONTEXT:  invalid type name "SUM(CASE WHEN totals.valid "

但当我删除INTO total1, total2声明时,代码运行得非常好.这里有什么问题?

推荐答案

  1. 你仍然在declare section名中.解析器希望您继续声明变量,直到它达到begin,因此它假设您正在try 声明名为select的内容,并跟随您希望它是什么类型.您会收到错误,因为sum(case..不是有效的类型名称.

    这不是一个好主意,但从技术上讲,您can定义了一个名为select的PL/pgSQL变量.

  2. 一旦您添加了声明后缺失的begin,您的代码的其余部分就可以了.这正是你可以做到的store Postgres SUM results in multiple variables.

  3. 使用aggregate filter clause.

Demo at db<>fiddle:

do $f$
  DECLARE
    total1 float;
    total2 float;
  BEGIN--this was missing
  SELECT
      SUM(amount)FILTER(WHERE totals.valid=0),
      SUM(amount)FILTER(WHERE totals.valid<>0)
  INTO total1, total2
  FROM
    totals;
end $f$;

Postgresql相关问答推荐

如何在PostgreSQL中对深度嵌套的jsonb属性创建索引

PostgreSQL:重新创建主键值以匹配记录计数

如何在PostgreSQL中 Select 最近30天内的开始日期?

如何在Postgres中对分区表使用Hibernate验证?

无法从外部连接到在 AWS EC2 实例上运行的 Postgres

如何在 PostgreSQL 的回归测试中测试 TYPE 发送和接收函数

将数组插入 Postgresql 数据库

PostgreSQL unnest 与空数组

Heroku Rails 4 无法连接到服务器:connection refused

运算符不存在:integer = integer[] 在使用 ANY 的查询中

SQL:当谈到 NOT IN 和 NOT EQUAL TO 时,哪个更有效,为什么?

PostgreSQL 提示:You will need to rewrite or cast the expression. column "state" is of type status but expression is of type character varying

Postgres UPDATE with ORDER BY,怎么做?

从 PostgreSQL 中的时间戳获取日期

如何在 PostgreSQL 中插入多行

在 postgresql 中将 bool 转换为 int

Postgresql - 更新规则 - 可能有一个最后修改日期,自动更新该行的on update?

将数据推送到 Heroku 时出错:time zone displacement out of range

如何将 CSV 数据插入 PostgreSQL 数据库(远程数据库)

在 pg_restore 期间排除表