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

Posted

技术标签:

【中文标题】从表中选择数组并加入另一个表中的 jsonb 对象【英文标题】:SELECT array from table and join on jsonb object in another table 【发布时间】:2019-11-28 02:50:19 【问题描述】:

不确定这是怎么可能的,但我发现没有任何答案是远程接近的。

假设我有表 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

所以我正在尝试做的是查询或某种连接,它将根据在案例 100005 中提供 to_id 从表 a 中获取结果 from_id,并从这些结果中查看是否存在 json obejct使用与 from_id 之一匹配的键。如果是这样,则从匹配的键中返回该值。 看起来有点复杂,但不幸的是,这就是现在的结构。

【问题讨论】:

从您的表格中添加一些 text 格式的示例行,以轻松模拟您的问题。 我没听懂。请添加一些示例数据和预期输出 【参考方案1】:

您可以使用子查询将 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;

【讨论】:

以上是关于从表中选择数组并加入另一个表中的 jsonb 对象的主要内容,如果未能解决你的问题,请参考以下文章

从 jsonb 数组包含具有特定属性的元素的表中选择

如何从表中选择记录并插入另一个表?

如果存在则从表中选择,否则从oracle中的另一个表中选择

如何从1个表中选择许多行并将其插入另一个表中特定行的特定JSONB字段中?但是在单个原始SQL查询中

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值

从表中的多个值中选择不在数组中的位置