PostgreSQL error: CASE with JSON set-returning functions
PostgreSQL error: CASE with JSON set-returning functions
我有一个 SELECT 语句和一个使用 JSON 函数的 CASE,它在升级到 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
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.
我不明白如何使用 LATERAL FROM 作为替代方法。事实上,我不完全理解为什么会使用 LATERAL,即使在阅读 the PG docs (section 7.2.1.5).
时也是如此
知道如何将此语句转换为适用于 PG 10 吗?
只要那些 set-returning 函数中的 none 会 return 多行,您可以将它们放在子查询中以绕过限制:
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
我有一个 SELECT 语句和一个使用 JSON 函数的 CASE,它在升级到 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
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.
我不明白如何使用 LATERAL FROM 作为替代方法。事实上,我不完全理解为什么会使用 LATERAL,即使在阅读 the PG docs (section 7.2.1.5).
时也是如此知道如何将此语句转换为适用于 PG 10 吗?
只要那些 set-returning 函数中的 none 会 return 多行,您可以将它们放在子查询中以绕过限制:
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