Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Postgres中从json列中提取键和值?_Sql_Json_Postgresql_Jsonb - Fatal编程技术网

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

Sql 如何在Postgres中从json列中提取键和值?,sql,json,postgresql,jsonb,Sql,Json,Postgresql,Jsonb,我想用Postgresql将从json列提取的键值对添加到表中 我有一个带有uid的items_表,数据列是json格式的多对数据。如下所示的初始表: uid | data 1 | {"item1":"string1", "item2":"string2"} 2 | {"item2":"string3", "item5":"string1", "item7":"string5"} 3 | {"item1":"string3", "item4":"string1", "item6":

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

我有一个带有uid的items_表,数据列是json格式的多对数据。如下所示的初始表:

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"}

因此,某些项/字符串可能重复,字段长度也可能不同

我尝试应用文档中提到的jsonb_对象_键,但出现了一个错误

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

我希望通过以下方式获得表结果,以按项和字符串进行拆分,展开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;

是一个dbfiddle。

您可以使用
json\u each\u text()
方法轻松地将
jsonb
类型列拆分为两个单独的列:

select uid, (js).key as items, (js).value as strings
  from
  (
   select uid, jsonb_each_text(data) as js
     from tab
  ) q 
或者更直接地使用
交叉连接

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