0

我刚刚将我的 Postres 从 9.1 更新到 12,现在我从特定查询中收到此错误消息:

SQLSTATE[0A000]: Feature not supported: 7 ERROR: set-returning functions are not allowed in CASE LINE 17: generate_series(start_date, ^ HINT: You might be able to move the set-returning function into a LATERAL FROM item.

生成该错误的实际查询是更大的一部分,但实际行是:

CASE
    WHEN num_payments > 1 THEN
        generate_series(start_date, start_date + ((payment_interval*(num_payments-1)) || payment_interval2)::interval, (payment_interval::text || payment_interval2)::interval)::date
    ELSE
        start_date
END

作为第一次看到这条消息,我不知道这意味着什么。我如何move the set-returning function into a LATERAL FROM item作为错误消息提示?

4

2 回答 2

0

这就是所谓的“横向连接”——基本上它是一个计算列,与您当前的查询“交叉连接”。

像这样使用它:

SELECT MY_LATERAL,
     -- etc other columns 
FROM YOUR_TABLE 
  LATERAL (CASE
           WHEN num_payments > 1 THEN
             generate_series(start_date, start_date + ((payment_interval*(num_payments-1)) || payment_interval2)::interval, (payment_interval::text || payment_interval2)::interval)::date
           ELSE start_date
           END) AS MY_LATERAL

文档https://www.postgresql.org/docs/9.4/queries-table-expressions.html第 7.2.1.5 节

于 2019-12-17T15:38:00.423 回答
0

由于某种原因,我无法使用它,LATERAL因为它只是生成了其他语法错误消息(从长远来看,我必须努力解决这个问题)。所以我能够通过简单地选择所有值然后CASE在查询中向上移动来解决我的问题,以便generate_series()不在 case 语句中:

SELECT other_columns, 
       CASE
           WHEN num_payments > 1 THEN date_2 ELSE date_1
       END AS start_date
FROM(
       SELECT other_columns, 
              start_date AS date_1,
              generate_series(start_date, start_date + ((payment_interval*(num_payments-1)) || payment_interval2)::interval, (payment_interval::text || payment_interval2)::interval)::date AS date_2
       FROM(
           -- INNER QUERY
       )a
)b
于 2019-12-18T09:34:03.367 回答