【问题标题】:Postgres: Store result of a query into a variable and use that variable in another queryPostgres:将查询结果存储到变量中并在另一个查询中使用该变量
【发布时间】:2018-03-20 13:28:38
【问题描述】:

我正在使用 PostgreSQL 9.6 的查询大致如下所示:

DO $$
DECLARE max_sales_date DATE ;
BEGIN

max_sales_date :=

select sales_date::date 
from (
     select count(sales_date::date)
        , sales_date::date
        , row_number() over (order by count(sales_date::date) desc) as rn 
     from Sales
     group by sales_date::date
     ) a where a.rn = 1 ;

select *
from Sales
where sales_date = max_sales_date ;

END $$ ;

如您所见,我想获得销售额最高的那一天,将其存储在一个变量中并在另一个查询中使用它。我知道在这种情况下不需要变量,但我需要这个用于尚未开始开发的另一个步骤。

不幸的是,DBeaver 5.0 向我抛出了以下错误消息:

内部 jdbc 驱动错误

java.lang.ArrayIndexOutofBoundsException:

我还必须提到,结果存储在变量中的查询在独立使用时可以正常工作。

因此我有两个问题:

  1. 为什么整个代码都不起作用?
  2. 我怎样才能达到我想要的结果?

编辑:下面的 cmets 让我意识到我应该澄清我的意图:我想继续使用变量的原因是因为我打算之后对其执行一些简单的计算(例如,添加一天,创建一个循环等)。如果你们可以在不使用变量的情况下找到一个简单的解决方案,我也会很高兴:)

【问题讨论】:

  • 能否将堆栈跟踪添加到查询中?
  • @LaurenzAlbe 恐怕我不知道它是什么以及如何获得它。
  • 这是一长串方法名称,通常跟在 Java 中的错误消息后面。
  • 为了找到更简单的解决方案,您需要提出您正在尝试解决的实际问题。可以使用 CTE 重新使用最大值。但显然这不是你想做的唯一事情

标签: postgresql variables dbeaver


【解决方案1】:

您可以使用 select ... 进入模式,并且您不能在 DO 函数中使用“select *”查询 - 这并不意味着返回查询。

DO $$
DECLARE max_sales_date DATE ;
declare sale record;
BEGIN

select sales_date into max_sales_date  from 
(select sales_date from (select count(sales_date) as cnt, sales_date::date 
    from Sales group by sales_date) as dt order by cnt desc limit 1) as ct;

for sale in select * from Sales where sales_date = max_sales_date
loop
-- do whatever is needed with this data
end loop;

END $$ ;

【讨论】:

  • OP 说:我知道在这种情况下不需要变量,但我需要这个用于尚未开始开发的另一个步骤。
  • 以保留变量的方式编辑查询。
  • 但这与问题完全相同。你认为这不会抛出异常吗?好吧,@Guillaume 可以回答这个问题。
  • 我猜这个“选择 *”将是尚未准备好的东西的一部分。当我测试上面的代码时,错误发生在 select * 部分 - 你应该用这个选择“做点什么”,因为 do 块无法返回数据。将代码更改为功能齐全的代码。
猜你喜欢
  • 2019-12-29
  • 2016-04-07
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 2016-06-21
相关资源
最近更新 更多