问题描述
这是我在表itineraries
的一行中的jsonb字段trips
的数据示例:
[
{
"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"
}
]
我的目标是返回此jsonb字段trips
的最早departure_date_start
排序的itineraries
中的行。这是我的简单尝试:
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';
每次旅行将返回多行。
如果您希望每次旅行只将结果限制为一行,则可以按以下方式对返回的列进行分组:
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.itineraries
order by min(i.datel->>'departure_date_start')