【问题标题】:How do I fix a Postgres 12 Error: set-returning functions are not allowed in CASE如何修复 Postgres 12 错误:CASE 中不允许设置返回函数
【发布时间】:2019-12-17 15:31:03
【问题描述】:

我刚刚将我的 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作为错误消息提示?

【问题讨论】:

    标签: sql postgresql postgresql-9.1 set-returning-functions postgresql-12


    【解决方案1】:

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

    像这样使用它:

    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 节

    【讨论】:

      【解决方案2】:

      由于某种原因,我无法使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-16
        • 2018-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        • 2020-11-04
        相关资源
        最近更新 更多