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')