在 PostgreSQL 的 WHERE 子句中不允许使用集合返回函数

问题描述 投票:0回答:1

我正在尝试在 2 个不同表中的 2 个 jsonb 数组之间进行连接。链接它们的 id 位于数组内部。

这是我尝试过的,我在 postgres 上创建了一个函数,它返回一个 Id 列表(来自表 B),我试图将它们与表 A 匹配。

TableA
ID | resultA 
1  | {records:[{id: 1, key: A, value: High}, {id: 2, key: B, value:Low}]}

TableB
ID | resultB
2  | {records:[{key: A, value: New Equipment}, {key: B, value: Old Equipment}]

所以我得到了 SQL 来显示两个 Id 的 2 列

select elem-> 'key' as TableA_id from TableA, lateral jsonb_array_elements(resultA -> 'records') elem
where elem-> 'key' in (public.myfunction('999'))

我面临以下错误:WHERE 中不允许使用设置返回函数

不知道这里出了什么问题。

postgresql jsonb
1个回答
7
投票

虽然 WHERE 子句中的子查询可以工作,但为什么不在集合返回函数上执行 INNER JOIN 呢?

SELECT elem->>'key' AS TableA_id
FROM TableA
 CROSS JOIN LATERAL jsonb_array_elements(TableA.resultA->'records') AS elem
 INNER JOIN public.myfunction('999') AS func(key) ON (func.key = elem->>'key');

另外,你真的想要返回一个 jsonb 值吗?我忍不住想你是想回短信。

elem->'key'
将返回 jsonb 值,而
elem->>'key'
将以文本形式返回密钥。我上面的示例返回看起来最合适的文本。

如果你真的想保留 WHERE 子句......

SELECT elem->>'key' AS TableA_id
FROM TableA
 CROSS JOIN LATERAL jsonb_array_elements(TableA.resultA->'records') AS elem
WHERE elem->>'key IN (SELECT * FROM public.myfunction('999'));

我个人更喜欢第一种带有 INNER JOIN 的形式。

© www.soinside.com 2019 - 2024. All rights reserved.