从表中选择数组,并在另一个表中加入jsonb对象

时间:2019-07-19 06:40:09

标签: sql postgresql jsonb

不知道怎么可能,但是我发现没有答案遥不可及。

假设我有表A和表B。表B有一个jsonb列,键和值均为整数。例如{"10000":"12345678","10002":"12345680}

我想查询表A,并从A的结果按键检查结果之一是否在该json对象中,并返回val。该值是一个Unix时间戳,我想对此进行排序。

我尝试了各种jsonb函数,但是没有什么比我正在尝试的

我尝试了类似的操作,但得到了error

SELECT a.from_id, b.*, info.id, info.date 
FROM table a, 
     table b, 
     jsonb_to_recordset(jsonb_each_text(b.mem_ids)) AS info(id int, date int) 
WHERE a.from_id = info.id 
ORDER BY info.date 
DESC LIMIT 1

我只想得到在与表A的ID相匹配的json对象中找到的第一个结果。 不知道如何使用jsonb列来完成。

更新: 示例表

table a
|from_id | to_id |
 100001  | 100005
 100002  | 100005
 100003  | 100005


table b
|   id       |            mem_ids|
     1       | {"100075":"12345678","100003":"12345680}

所以我想做的是查询或某种联接,它将基于表100a中提供的to_id从表a中获得from_id的结果,并从这些结果中查看是否存在json obejct使用与from_id之一匹配的键。如果是这样,请从匹配的键返回该值。 看起来有点复杂,但是很遗憾,这就是现在的结构。

1 个答案:

答案 0 :(得分:0)

您可以使用子查询将jsonb列转换为表外观

select jsonb_object_keys(mem_ids) as id, mem_ids->>jsonb_object_keys(mem_ids) as date  
    from (
         select '{"10000":123,"10002":456}'::jsonb as mem_ids
         union 
         select '{"20000":987,"20002":159}'::jsonb as mem_ids
    ) as b;

然后,您当然可以通过INNER JOIN将结果与您的主表简单连接

select from_id, to_id, date from (
        select 100001 as from_id, 100005 as to_id
        union 
        select 100002 as from_id, 100005 as to_id
        union 
        select 100003 as from_id, 100005 as to_id) as a
    inner join  (
        select jsonb_object_keys(mem_ids)::int as id, mem_ids->>jsonb_object_keys(mem_ids) as date  from (
            select 1 as id, '{"100075":12345678,"100003":12345680}'::jsonb as mem_ids
            union 
            select 2 as id, '{"200075":987654321,"200003":1592648}'::jsonb as mem_ids
        ) as b
    ) as b on from_id = id
ORDER BY date desc
LIMIT 1;