Posgres-JSONB数组中按字段排序?

问题描述

这是我在表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')