如何修复Postgres 12错误:在CASE中不允许使用返回值的函数

时间:2019-12-17 15:31:03

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

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

scoring

产生该错误的实际查询是其中很大一部分的一部分,但实际的行是:

$approvalLink = sprintf('<a href="%s/Request/Approval/code/%s">Approve</a>', $url, $Code);

第一次看到此消息,我不知道这意味着什么。如何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. 作为错误消息提示?

2 个答案:

答案 0 :(得分: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节

答案 1 :(得分: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