postgresql - 从 jsonb 中的列表中提取信息
问题描述
我有一个名为 jsonb 的列jsonb
,其中包含以下格式的数据。
{
"stuff": [
{
"name": "foo",
"percent": "90.0000"
},
{
"name": "bar",
"percent": "10.0000"
}
],
"countries": [
{
"name": "USA",
"value": "30"
},
{
"name": "Canada",
"value": "25"
},
{
"name": "Mexico",
"value": "20"
},
{
"name": "Ecuador",
"value": "10"
}
]
}
我在处理这些数据时遇到了很多麻烦。具体来说,我想要做的是找到所有不同的值"name"
可以有 in"stuff"
以及 in "countries"
,有点像SELECT distinct
.
但我的问题是我似乎无法从这个 jsonb 中提取任何有用的东西。到目前为止,我的方法是做
SELECT jsonb->>'stuff' FROM table
,但这只给了我一个text
包含的类型列[{"name": "foo","percent": "90.0000"},{"name": "bar","percent": "10.0000"}]
。
但由于这是文本,我真的无法用它做任何事情。我也尝试过SELECT jsonb_array_elements_text(jsonb) FROM table
,但返回了以下错误:
ERROR: cannot extract elements from an object
SQL state: 22023
非常感谢使用这种数据格式的任何帮助!
解决方案
您需要分别取消嵌套每个数组,然后在这两个步骤的结果上创建一个联合:
select c.x ->> 'name'
from the_table
cross join lateral jsonb_array_elements(json_column -> 'countries') as c(x)
union
select s.x ->> 'name'
from the_table
cross join lateral jsonb_array_elements(json_column -> 'stuff') as s(x);
推荐阅读
- php - Nginx 使用 Laravel 和 Traefik 在 Docker 中返回欢迎页面
- sql-server - 如何命名 T-SQL 中计算字段的约束?
- apache - 如何将 Apache /server-info 保护到特定域并为所有其他域重定向 404?
- android - 将 Apollo 与房间数据库一起使用
- c++ - c语言中#define的理解
- javascript - 使用 VueJS 使用 3rd 方库打印元素
- apache - 带有斜杠的 htaccess 中的重定向规则
- java - 如何使用构造函数初始化抽象类中的字段
- hortonworks-sandbox - 所有服务都没有在 Hortonwork 沙盒 2.6.5 中运行
- css - 如何仅将自定义 CSS 样式应用于 Amp 页面