如何在 postgresql 的列中 return 一个 ARRAY/JSON 结构?
How can I return an ARRAY/JSON structure in a column in postgresql?
你好,我有一组表格如下,用一个最小的例子来解释我的问题(我想知道如何检索该结构,而不是更改数据库结构):
fruit:
id | name | form| texture_id
-------------------------------
1 | Apple | round | 1
2 | Banana | long | 1
fruit_varieties:
id | name | fruit_id | color
-------------------------------
1 | golden | 1| green
2 | fuji | 1| red
3 | canarias | 2| yellow
fruit_texture
id | name
-------------------------------
1 | soft
2 | hard
variety_countries
id | name | fruit_variety_id | average_temperature
-------------------------------
1 | france | 1 | 21
2 | spain | 1 | 24
3 | italy | 2 | 23
我想得到这个结构如下:
对于给定的 fruit.name=Apple
:
{
"fruit_name" = "Apple",
"form" = "round",
"texture" = "soft",
"fruit_properties" = [{
"variety_name" = "Golden",
"color" = "green",
"countries" = [{
"country" = "france",
"avg_temperature" = "21",
}, {
"country" = "spain",
"avg_temperature" = "24",
}
]
}, {
"variety_name" = "fuji",
"color" = "red",
"countries" = [{
"country" = "italy",
"avg_temperature" = "23",
}
]
}
]
}
所以我从这样的事情开始
SELECT
fruit.name AS fruit_name,
fruit.form AS form,
fruit_texture.name AS texture,
(
# I don't know how to handle this
) AS fruit_properties
FROM fruit
JOIN fruit_varieties
ON fruit.id = fruit_varieties.fruit_id
WHERE fruit.name = 'Apple'
现在我不知道如何 return 列中的那个数组,或者创建一个包含整个响应的 JSON。我已经花了几个小时尝试使用一些 JSON PATH
功能,我在一些问题中被建议使用,但我无法使它们工作。
有人可以用这个简单的例子给我提示吗?
您的输出结构不是标准的 JSON 格式。键和值之间应该是:
而不是=
。考虑到您需要标准 JSON 输出,请尝试下面提到的查询:
select row_to_json(d2) from (
select
name,
form,
texture,
json_agg(json_build_object('variety_name',variety_name,'color',color,'countries',countries)) "fruit_properties"
from
(
select
t1.name "name",
t1.form "form",
t3.name "texture",
t2.name "variety_name",
t2.color "color",
json_agg(json_build_object( 'country',t4.name,'temp',t4.average_temperature)) "countries"
from
fruit t1 inner join fruit_varieties t2 on t1.id=t2.fruit_id
inner join fruit_texture t3 on t1.texture_id=t3.id
inner join variety_countries t4 on t4.fruit_variety_id=t2.id
group by 1,2,3,4,5
) d1
group by 1,2,3
) d2
where d2.name='Apple'
如果您不使用 where 子句,上述查询将为每个水果 return 一行 JSON
值。
如果您确实想要问题中提到的输出,请在上述查询中将 row_to_json(d2)
替换为 replace(row_to_json(d2)::text,':', ' = ')
。
你好,我有一组表格如下,用一个最小的例子来解释我的问题(我想知道如何检索该结构,而不是更改数据库结构):
fruit:
id | name | form| texture_id
-------------------------------
1 | Apple | round | 1
2 | Banana | long | 1
fruit_varieties:
id | name | fruit_id | color
-------------------------------
1 | golden | 1| green
2 | fuji | 1| red
3 | canarias | 2| yellow
fruit_texture
id | name
-------------------------------
1 | soft
2 | hard
variety_countries
id | name | fruit_variety_id | average_temperature
-------------------------------
1 | france | 1 | 21
2 | spain | 1 | 24
3 | italy | 2 | 23
我想得到这个结构如下:
对于给定的 fruit.name=Apple
:
{
"fruit_name" = "Apple",
"form" = "round",
"texture" = "soft",
"fruit_properties" = [{
"variety_name" = "Golden",
"color" = "green",
"countries" = [{
"country" = "france",
"avg_temperature" = "21",
}, {
"country" = "spain",
"avg_temperature" = "24",
}
]
}, {
"variety_name" = "fuji",
"color" = "red",
"countries" = [{
"country" = "italy",
"avg_temperature" = "23",
}
]
}
]
}
所以我从这样的事情开始
SELECT
fruit.name AS fruit_name,
fruit.form AS form,
fruit_texture.name AS texture,
(
# I don't know how to handle this
) AS fruit_properties
FROM fruit
JOIN fruit_varieties
ON fruit.id = fruit_varieties.fruit_id
WHERE fruit.name = 'Apple'
现在我不知道如何 return 列中的那个数组,或者创建一个包含整个响应的 JSON。我已经花了几个小时尝试使用一些 JSON PATH
功能,我在一些问题中被建议使用,但我无法使它们工作。
有人可以用这个简单的例子给我提示吗?
您的输出结构不是标准的 JSON 格式。键和值之间应该是:
而不是=
。考虑到您需要标准 JSON 输出,请尝试下面提到的查询:
select row_to_json(d2) from (
select
name,
form,
texture,
json_agg(json_build_object('variety_name',variety_name,'color',color,'countries',countries)) "fruit_properties"
from
(
select
t1.name "name",
t1.form "form",
t3.name "texture",
t2.name "variety_name",
t2.color "color",
json_agg(json_build_object( 'country',t4.name,'temp',t4.average_temperature)) "countries"
from
fruit t1 inner join fruit_varieties t2 on t1.id=t2.fruit_id
inner join fruit_texture t3 on t1.texture_id=t3.id
inner join variety_countries t4 on t4.fruit_variety_id=t2.id
group by 1,2,3,4,5
) d1
group by 1,2,3
) d2
where d2.name='Apple'
如果您不使用 where 子句,上述查询将为每个水果 return 一行 JSON
值。
如果您确实想要问题中提到的输出,请在上述查询中将 row_to_json(d2)
替换为 replace(row_to_json(d2)::text,':', ' = ')
。