如何从Postgres的json列中提取键和值?

时间:2019-05-16 17:02:35

标签: sql json postgresql

我想使用PostgreSQL将从json列提取的键值对添加到表中。

我有一个具有uid的item_table和json中具有多对的data列。初始表如下:

     select jsonb_object_keys(data) 
     from items_table;

...

因此,某些项目/字符串可以重复,并且字段长度也可以变化。

我尝试应用文档中提到的jsonb_object_keys,但是发生了错误。

uid | items      | strings

1   | item1      | string1
1   | item2      | string2
2   | item2      | string3
2   | item5      | string1
2   | item7      | string5
3   | item1      | string3
3   | item4      | string1
3   | item6      | string8
3   | item5      | string5
4   | item1      | string4

错误函数jsonb_object_keys(字符变化)不存在提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换

我想通过以下方式获取表结果,以按项目和字符串拆分,扩展uid列:

def checker(df):
    df["accSync"] = df["accSync"].any()
    return df

new_df = a.groupby(by="company_id").apply(checker)

如何实现上述输出?

2 个答案:

答案 0 :(得分:0)

您应该能够提取键,然后提取值:

select key, v.j->key
from (values (1, '{"item1":"string1", "item2":"string2"}'::jsonb),
             (2, '{"item2":"string3", "item5":"string1", "item7":"string5"}'::jsonb)
     ) v(id, j) cross join lateral
     jsonb_object_keys(v.j) as key;

Here是db <>小提琴。

答案 1 :(得分:0)

您可以使用json_each_text()方法将jsonb类型的列轻松拆分为两个单独的列:

select uid, (js).key as items, (js).value as strings
  from
  (
   select uid, jsonb_each_text(data) as js
     from tab
  ) q 

Demo