Ошибка PostgreSQL: CASE с функциями, возвращающими набор JSON - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть оператор SELECT с CASE, который использует функции JSON, который перестал работать при обновлении до PostgreSQL 10.

SELECT
        CASE 
            WHEN type = 'a' THEN data #>> '{key_a,0}'
            WHEN type = 'b' THEN data #>> '{key_a,0,key_b,0}'
            WHEN type = 'c' THEN jsonb_object_keys(data #> '{key_c,key_d}')
            ELSE NULL
        END AS foo,
        CASE
            WHEN type = 'a' THEN jsonb_array_elements_text(data -> 'key_e')
            WHEN type = 'b' THEN data #>> '{key_f,0,key_g}'
            ELSE NULL
        END AS bar

ОШИБКА: функции возврата набора не разрешены в CASE

Подсказка: вы можете переместить функцию возврата набора в элемент LATERAL FROM.

Я не понимаю, как использование LATERAL FROM является альтернативой.На самом деле, я не до конца понимаю, почему LATERAL будет использоваться даже при чтении документов PG (раздел 7.2.1.5) .

Любые идеи о том, как это утверждение будет преобразовано в работус PG 10?

1 Ответ

0 голосов
/ 18 сентября 2018

Пока ни одна из этих функций, возвращающих множество, не вернет более одной строки, вы можете поместить их в подзапрос, чтобы обойти ограничение:

SELECT
        CASE 
            WHEN type = 'a' THEN data #>> '{key_a,0}'
            WHEN type = 'b' THEN data #>> '{key_a,0,key_b,0}'
            WHEN type = 'c' THEN (SELECT jsonb_object_keys(data #> '{key_c,key_d}'))
            ELSE NULL
        END AS foo,
        CASE
            WHEN type = 'a' THEN (SELECT jsonb_array_elements_text(data -> 'key_e'))
            WHEN type = 'b' THEN data #>> '{key_f,0,key_g}'
            ELSE NULL
        END AS bar
...