Postgres - 按 JSON 数组中的字段排序?
Posgres - Order by field within JSONB array?
这是我的 table trips
:
行中我的 jsonb 字段 itineraries
的数据样本
[
{
"nights": 10,
"destinations": [
"Cronaside",
"New Emory",
"East Mattiechester"
],
"departure_date_end": "2020-09-21",
"return_date_latest": "2020-10-01",
"departure_date_start": "2020-09-14"
},
{
"nights": 10,
"destinations": [
"Port Verdie",
"Chaunceymouth",
"Isabellemouth"
],
"departure_date_end": "2020-10-08",
"return_date_latest": "2020-10-18",
"departure_date_start": "2020-09-14"
}
]
我的目标是 trips
中的 return 行按此 jsonb 字段 itineraries
最早的 departure_date_start
排序。这是我的简单尝试:
SELECT *
from trips
ORDER BY itineraries->>'departure_date_start' ASC
但是,因为 itineraries
是一个数组并且可以有多个 departure_date_start
值,Postgres 会自动处理吗?或者我需要遍历数组吗?
使用 Postgres 9.6
您需要扩充数组。
select t.*
from trips t
cross join lateral jsonb_array_elements(t.itineraries) as i(datel)
order by i.datel->>'departure_date_start';
这将 return 每个行程多行。
如果您想将每次行程的结果限制为一行,那么您可以按您正在 return 的列分组,如下所示:
select t.id, t.some_col, t.some_other_column, t.itineraries,
min(i.datel->>'departure_date_start') as departure_date_start
from trips t
cross join lateral jsonb_array_elements(t.itineraries) as i(datel)
group by t.id, t.some_col, t.some_other_column, t.itineraries
order by min(i.datel->>'departure_date_start')
这是我的 table trips
:
itineraries
的数据样本
[
{
"nights": 10,
"destinations": [
"Cronaside",
"New Emory",
"East Mattiechester"
],
"departure_date_end": "2020-09-21",
"return_date_latest": "2020-10-01",
"departure_date_start": "2020-09-14"
},
{
"nights": 10,
"destinations": [
"Port Verdie",
"Chaunceymouth",
"Isabellemouth"
],
"departure_date_end": "2020-10-08",
"return_date_latest": "2020-10-18",
"departure_date_start": "2020-09-14"
}
]
我的目标是 trips
中的 return 行按此 jsonb 字段 itineraries
最早的 departure_date_start
排序。这是我的简单尝试:
SELECT *
from trips
ORDER BY itineraries->>'departure_date_start' ASC
但是,因为 itineraries
是一个数组并且可以有多个 departure_date_start
值,Postgres 会自动处理吗?或者我需要遍历数组吗?
使用 Postgres 9.6
您需要扩充数组。
select t.*
from trips t
cross join lateral jsonb_array_elements(t.itineraries) as i(datel)
order by i.datel->>'departure_date_start';
这将 return 每个行程多行。
如果您想将每次行程的结果限制为一行,那么您可以按您正在 return 的列分组,如下所示:
select t.id, t.some_col, t.some_other_column, t.itineraries,
min(i.datel->>'departure_date_start') as departure_date_start
from trips t
cross join lateral jsonb_array_elements(t.itineraries) as i(datel)
group by t.id, t.some_col, t.some_other_column, t.itineraries
order by min(i.datel->>'departure_date_start')