我如何在 Postgres 中 SELECT 一列 json 对象,以便返回的行是 json 数组的数组?
How do I SELECT a column of json objects in Postgres so that the rows returned are json arrays of arrays?
我有一个只有一个 jsonb 列的 table。如何执行 select 查询,将每个 jsonb 行转换为一个 jsonb 数组,其中每个项目都是另一个数组,第一个索引是键,第二个索引是值?密钥无法提前知道。
使用此查询选择列:
SELECT myRow FROM myTable
returns 行具有以下 jsonb 值:
{
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": "value4",
"key5": "value5"
}
我希望输出行如下所示:
[
["key1", "value1"],
["key2", "value2"],
["key3", "value3"],
["key4", "value4"],
["key5", "value5"]
]
SELECT
json_agg(arr)
FROM
my_table,
json_each(my_row),
json_build_array(key, value) as arr
json_each
将您的 json 对象扩展为每个属性一行。它为键创建一列,为值创建一列。
json_build_array
为每条记录创建内部数组
json_agg
将 (2) 中的数组聚合成一个巨大的数组。
S-Man 的查询会将原始 table 中的所有行合并到一个大数组中。从你的问题中不清楚这是否是你想要的。如果您希望每一行都有自己的数组,您可以这样做:
select arr
from data
join lateral(
select jsonb_agg(jsonb_build_array(key, value)) arr
from jsonb_each(j)
) sub on true;
这是一个使用 CTE 中的一些数据的示例:
with data(j) as (
select '{
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": "value4",
"key5": "value5"
}'::jsonb
UNION select '{"key6": "value6"}'
)
select arr
from data
join lateral(
select jsonb_agg(jsonb_build_array(key, value)) arr
from jsonb_each(j)
) sub on true;
arr
------------------------------------------------------------------------------------------------------
[["key6", "value6"]]
[["key1", "value1"], ["key2", "value2"], ["key3", "value3"], ["key4", "value4"], ["key5", "value5"]]
(2 rows)
我有一个只有一个 jsonb 列的 table。如何执行 select 查询,将每个 jsonb 行转换为一个 jsonb 数组,其中每个项目都是另一个数组,第一个索引是键,第二个索引是值?密钥无法提前知道。
使用此查询选择列:
SELECT myRow FROM myTable
returns 行具有以下 jsonb 值:
{
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": "value4",
"key5": "value5"
}
我希望输出行如下所示:
[
["key1", "value1"],
["key2", "value2"],
["key3", "value3"],
["key4", "value4"],
["key5", "value5"]
]
SELECT
json_agg(arr)
FROM
my_table,
json_each(my_row),
json_build_array(key, value) as arr
json_each
将您的 json 对象扩展为每个属性一行。它为键创建一列,为值创建一列。json_build_array
为每条记录创建内部数组json_agg
将 (2) 中的数组聚合成一个巨大的数组。
S-Man 的查询会将原始 table 中的所有行合并到一个大数组中。从你的问题中不清楚这是否是你想要的。如果您希望每一行都有自己的数组,您可以这样做:
select arr
from data
join lateral(
select jsonb_agg(jsonb_build_array(key, value)) arr
from jsonb_each(j)
) sub on true;
这是一个使用 CTE 中的一些数据的示例:
with data(j) as (
select '{
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": "value4",
"key5": "value5"
}'::jsonb
UNION select '{"key6": "value6"}'
)
select arr
from data
join lateral(
select jsonb_agg(jsonb_build_array(key, value)) arr
from jsonb_each(j)
) sub on true;
arr
------------------------------------------------------------------------------------------------------
[["key6", "value6"]]
[["key1", "value1"], ["key2", "value2"], ["key3", "value3"], ["key4", "value4"], ["key5", "value5"]]
(2 rows)