如何遍历不同的WITH语句

时间:2017-08-09 01:06:07

标签: sql postgresql

出于隐私原因,我无法发布整个查询,但我们的查询看起来像这样

> WITH datee as (SELECT '2017-06-25 00:00:00-00'::DATE as dateee) SELECT
> tab1.a  FROM (super long query here that references dateee a lot) as tab1

我需要这个来迭代一系列日期,比如2017-03-25 00:00:00-00到2017-06-25 00:00:00-00。

有没有办法自动化它而不必在当时运行查询一个日期?

1 个答案:

答案 0 :(得分:0)

使用generate_series(startdate, enddate, interval)

SELECT generate_series(DATE '2017-06-25', DATE '2017-08-01', INTERVAL '1' DAY)

或者,如果它是一组不相关的日期,请使用值表达式

WITH datee as (VALUES ('2017-06-25'), ('2017-08-14')) 
SELECT

或(更容易从某些工具或语言生成)将数组传递给unfst:

WITH datee(datee) as (SELECT unnest($1))

其中$1类型为date[]

的绑定参数

由于deficiency in PostgreSQL's CTE support,您最好将输入用作FROM中的条款,而不是CTE(WITH查询)。所以

SELECT ...
FROM (
  SELECT unnest($1)
) AS datee(datee)

除了在这种情况下,您可以进一步简化LATERAL加入

SELECT ..
FROM (super long query) ...
     LATERAL unnest($1) AS dateee(datee)

可能表现最佳。