使用 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"值。这可能吗?

完整fiddle is here.

我想根据在 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;

SQL Fiddle.

注意一个细微的区别:原始查询中的 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