我正在尝试根据另一行的数组元素的顺序选择记录:
SELECT *
FROM tester
WHERE id IN (
SELECT jsonb_array_elements(d->'fam')->>'id'
FROM tester
WHERE id='3'
)
我知道this solution。
不同之处在于我不知道如何动态生成“排序”值。这可能吗?
我希望看到基于json数据中找到的顺序的结果:
id name d
-- ----- --------
2 barb {"fam": [{"id": 1}, {"id": 3}]}
4 jaimie {"fam": [{"id": 3}, {"id": 2}, {"id": 1}]}
1 bob {"fam": [{"id": 3}, {"id": 2}, {"id": 4}]}
答案 0 :(得分:1)
在WITH ORDINALITY
联接中使用LATERAL
来保留数组的原始顺序:
SELECT t.*
FROM tester t1
CROSS JOIN jsonb_array_elements(t1.d->'fam') WITH ORDINALITY fam(id, ord)
JOIN tester t ON t.id = fam.id->>'id'
WHERE t1.id = '3'
ORDER BY fam.ord;
请注意一个细微差别:原始查询中的IN
构造不仅会删除原始订单,还会删除重复项。我的查询以原始顺序保留从数组中提取的所有ID,无论是否重复。
LATERAL
关键字是table functions的可选噪音。与 table 别名的AS
关键字一样。会去这里:
CROSS JOIN LATERAL jsonb_array_elements(d->'fam') WITH ORDINALITY AS fam(id, ord)
相关: