使用jsonb数组按IN值排序

时间:2017-10-30 01:55:04

标签: sql arrays postgresql jsonb set-returning-functions

我正在尝试根据另一行的数组元素的顺序选择记录:

SELECT * 
  FROM tester
  WHERE id IN (
    SELECT jsonb_array_elements(d->'fam')->>'id' 
    FROM tester
    WHERE id='3'
  ) 

我知道this solution

不同之处在于我不知道如何动态生成“排序”值。这可能吗?

完整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}]}

1 个答案:

答案 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;

SQL Fiddle.

请注意一个细微差别:原始查询中的IN构造不仅会删除原始订单,还会删除重复项。我的查询以原始顺序保留从数组中提取的所有ID,无论是否重复。

LATERAL关键字是table functions的可选噪音。与 table 别名的AS关键字一样。会去这里:

CROSS  JOIN LATERAL jsonb_array_elements(d->'fam') WITH ORDINALITY AS fam(id, ord)

相关: