使用 jsonb 数组按 IN 值排序
Order by the IN value with jsonb array
我正在尝试 select 根据另一行数组元素的顺序记录:
SELECT *
FROM tester
WHERE id IN (
SELECT jsonb_array_elements(d->'fam')->>'id'
FROM tester
WHERE id='3'
)
我知道 this solution。
不同的是我不知道如何动态生成"ordering"值。这可能吗?
我想根据在 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}]}
使用WITH ORDINALITY
in a 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 <b>LATERAL</b> jsonb_array_elements(d->'fam') WITH ORDINALITY <b>AS</b> fam(id, ord)
相关:
- PostgreSQL unnest() with element number
- Query for array elements inside JSON type
我正在尝试 select 根据另一行数组元素的顺序记录:
SELECT *
FROM tester
WHERE id IN (
SELECT jsonb_array_elements(d->'fam')->>'id'
FROM tester
WHERE id='3'
)
我知道 this solution。
不同的是我不知道如何动态生成"ordering"值。这可能吗?
我想根据在 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}]}
使用WITH ORDINALITY
in a 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 <b>LATERAL</b> jsonb_array_elements(d->'fam') WITH ORDINALITY <b>AS</b> fam(id, ord)
相关:
- PostgreSQL unnest() with element number
- Query for array elements inside JSON type