postgresql遍历JSONB数组并执行SELECTs

时间:2019-08-15 11:42:37

标签: sql postgresql

我的一张桌子上有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

1 个答案:

答案 0 :(得分: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. 之后,再次根据数组元素重新创建数组
  6. 将此数组放入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