我正在尝试在 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 中不允许使用设置返回函数
不知道这里出了什么问题。
虽然 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 的形式。