Возвращающие множество функции не разрешены в CASE в postgreSQL - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь выполнить этот запрос смог до некоторого времени назад.Я не знаю, что пошло не так, и я начал получать эту ошибку сейчас?

Your database returned: ERROR: set-returning functions are not allowed in CASE Hint: You might be able to move the set-returning function into a LATERAL FROM item.

Мой запрос:

SELECT distinct
(CASE
WHEN {PERIOD} = 'Previous Quarter' AND pto.pto_start_date < (date_trunc('quarter', now() - INTERVAL '1 month') + INTERVAL '1 month')::date AND pto.pto_end_date >= (date_trunc('quarter', now() - INTERVAL '1 month') + INTERVAL '1 month')::date
THEN generate_series(pto.pto_start_date, pto.pto_end_date, '2 day'::interval)
WHEN {PERIOD} = 'Current Quarter' AND pto.pto_start_date < (date_trunc('quarter', now() - INTERVAL '1 month') + INTERVAL '1 month')::date AND pto.pto_end_date >= (date_trunc('quarter', now() - INTERVAL '1 month') + INTERVAL '1 month')::date
THEN generate_series(pto.pto_start_date, pto.pto_end_date, '1 day'::interval)
ELSE
generate_series(pto.pto_start_date, pto.pto_end_date, '1 day'::interval)
END) AS dt
FROM cust_pto pto

Даты начала и окончания Даты:

enter image description here

Что пошло не так?

1 Ответ

0 голосов
/ 23 октября 2018

Почему вы получаете ошибку сейчас: вы обновились до postgres 10. Заданные функции возврата больше не разрешены.

Что делать: есть несколько способов выполнить то, что вы пытаетесь сделатьделать.Чтобы сохранить его как можно ближе к исходному запросу, все, что вам нужно сделать, - это поместить ваш оператор CASE в generate_series:

SELECT distinct generate_series(
        pto.pto_start_date,
        pto.pto_end_date,
        CASE
        WHEN {PERIOD} = 'Previous Quarter' AND pto.pto_start_date < (date_trunc('quarter', now() - INTERVAL '1 month') + INTERVAL '1 month')::date AND pto.pto_end_date >= (date_trunc('quarter', now() - INTERVAL '1 month') + INTERVAL '1 month')::date THEN
            '2 day'::interval
        ELSE
            '1 day'::interval
        END
) AS dt
FROM cust_pto pto
...