【问题标题】:postgresql Looping through JSONB array and performing SELECTspostgresql 循环遍历 JSONB 数组并执行 SELECT
【发布时间】:2019-08-15 22:39:31
【问题描述】:

我的一张桌子上有 jsonb

jsonb 是这样的

my_data : [
     {pid: 1, stock: 500},   
     {pid: 2, stock: 1000},
     ...
]

pid指的是products'表id(即pid

编辑:表格产品具有以下属性:pid (PK)、name

我想在我的 JSONB 中循环 my_data[] 并从产品表中获取 pid 的名称。

我需要结果看起来像这样(包括第二个表中的产品名称)->

my_data : [ 
       { 
          product_name : "abc", 
          pid: 1, 
          stock : 500 
       },
       ...
]

我应该如何去执行这样的 jsonb 内连接?

编辑:- 尝试了 S-Man 的解决方案,但我收到了这个错误

"对表 \"jc\"" 的 FROM 子句条目的无效引用

这里是 SQL QUERY

【问题讨论】:

  • 您的问题表明您有 jsonb 值并且您想要一个 jsonb 输出。但是获取 pid 和 product... 这很令人困惑。你在期待什么?
  • @S-Man 我有一个作为 jsonb 属性的主表。该 jsonb 属性是 my_data (数组)。该对象数组具有引用另一个表名称“产品”的 pid。所以我需要执行一个查询,它可以将 pid 与名称连接起来,并给我所需的输出。有问题的查询在主表上执行

标签: sql postgresql


【解决方案1】:

step-by-step demo:db<>fiddle

SELECT
    jsonb_build_object(                                                            -- 5
        'my_data',
        jsonb_agg(                                                                 -- 4
             elems || jsonb_build_object('product_name', mot.product_name)         -- 3
        )
    )
FROM
    mytable,
    jsonb_array_elements(mydata -> 'my_data') as elems                              -- 1
JOIN
    my_other_table mot ON (elems ->> 'pid')::int = mot.pid                          -- 2
  1. 将 JSON 数组扩展为每个数组元素一行
  2. 使用 pid 值将另一个表与当前表连接起来(注意 ::int 演员表,否则它将是文本值)
  3. 现在可以将第二个表中的新列转换为 JSON 对象。可以使用|| 运算符将这个连接到原始的上
  4. 之后再次从数组元素重新创建数组
  5. 将这个数组放入 my_data 元素中

另一种方法是使用jsonb_set(),而不是第 5 步,直接将数组重置为原始数组:

step-by-step demo:db<>fiddle

SELECT
   jsonb_set(
       mydata,
       '{my_data}',
       jsonb_agg(
            elems || jsonb_build_object('product_name', mot.product_name)
       )
   )
FROM
    mytable,
    jsonb_array_elements(mydata -> 'my_data') as elems
JOIN
    my_other_table mot ON (elems ->> 'pid')::int = mot.pid
GROUP BY mydata

【讨论】:

  • 我的 jsonb 数组只包含 pid,它是产品表 pid 的外键。所以我需要执行连接查询才能获得 product_name 列
  • 已更改,添加了逐步演示小提琴
  • 添加了第二种方式
  • 哇,您的快速回复。非常感谢。同样对于第二种情况,如果我有多个嵌套数组。例如:- [ { heading: 'test', pItems: [{ pid: 5,stock 500 }] } ] 你将如何取消嵌套多个数组?
  • 如果第一种情况顶部只有一个元素,否则必须扩展两个具有相同功能的数组(第二种情况):dbfiddle.uk/…
猜你喜欢
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 2021-01-14
  • 2017-08-16
  • 1970-01-01
  • 2014-06-04
相关资源
最近更新 更多