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

标签 sql json postgresql jsonb

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

我有一个 items_table,其中包含 json 中的 uid 和数据列,其中有多对。初始表如下所示:

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_object_keys,但是发生了错误。

     select jsonb_object_keys(data) 
     from items_table;

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

我想通过以下方式获取表格结果,以按项目和字符串拆分,扩展 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

如何实现上述输出?

最佳答案

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

或更直接地使用交叉连接:

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

Demo

关于sql - 如何从Postgres中的json列中提取键和值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56173393/

相关文章:

php - 如何根据 php 条件显示隐藏 html 表格行

sql - 错误: Unrecognized name: Google BigQuery

android ListView 是空的 Logcat 什么都不显示

json - Swift:如何将可编码类型作为函数输入传递以编码或解码 json

mysql - 如何为许多用户的网站生成唯一代码

php - 使用 PHP 显示 SQL 结果

mysql - UNION 2 个具有不同列号的表,然后计算行数并将没有计数的行设置为 0

ruby-on-rails - HTTParty 正在转义 JSON

PostgreSQL 流式复制

postgresql - Postgres 查询优化(强制索引扫描)