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

How to extract key and value from json column in Postgres?

我想使用 Postgresql 添加从 json 列提取的键值对到 table。

我有一个 items_table,在 json 中有一个带有 uid 和数据列的多对。初始 table 看起来像:

uid | data

1   | {"item1":"string1", "item2":"string2"}
2   | {"item2":"string3", "item5":"string1", "item7":"string5"}
3   | {"item1":"string3", "item4":"string1", "item6":"string8", "item5":"string5"}
4   | {"item1":"string4"}

...

因此,一些 items/strings 可以重复,字段长度也可以变化。

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

     select jsonb_object_keys(data) 
     from items_table;

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

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

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

如何实现上述输出?

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

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<>fiddle.

您可以使用 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 

或更直接地使用 cross join :

select uid, js.items, js.value as strings
  from tab
 cross join jsonb_each_text(data) as js(items)

Demo