从 jsonb 中的列表中提取信息
Extracting info out of lists inside a 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"
在 "stuff"
和 "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);
我有一个名为 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"
在 "stuff"
和 "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);