从 PostgreSQL 9.6 升级到 11 时,以下查询停止工作:
with doc as (select * from documents where name = doc_id)
select jsonb_array_elements_text(permissions)
from users
where users.name = user_name
union
select
case
when doc.reader = user_name then 'read'
when doc.owner = user_name then unnest(array['read','write'])
else unnest(array[]::text[])
end
from doc;
union
像往常一样将两个值列表放在一起,两个列表可以有零个、一个或多个元素。
第一个select
可以返回零,一个或多个只是因为那是users
表中的内容。
第二个select
总是从表中扫描一行documents
,但根据决定返回零、一或多行case
。
PostgreSQL 9.6 按预期工作,PostgreSQL 11 说:
ERROR: set-returning functions are not allowed in CASE
LINE 56: else unnest(array[]::text[])
^
HINT: You might be able to move the set-returning function into a LATERAL FROM item.
我很欣赏这个建议,但我不知道如何在LATERAL FROM
这里使用 a 。