Postgres jsonb упорядочивает строки в порядке возрастания значения jsonb - PullRequest
0 голосов
/ 18 июня 2020

У меня в таблице есть поле jsonb под названием « day_parting ». Это выглядит так:

[{"end_time": 12, "start_time": 0}, {"end_time": 18, "start_time": 17}] 

Он имеет массив значений, которые представляют различное время начала и время окончания.

Я выполняю запрос, который объединяет и фильтрует две таблицы, и какой бы результат я ни получил, я хочу, чтобы он был упорядочен в порядке возрастания времени начала day_parting.

Например:

ad1, [{"end_time": 12, "start_time": 11}, {"end_time": 18, "start_time": 17}]
ad2, [{"end_time": 12, "start_time": 7}, {"end_time": 18, "start_time": 13}]
ad3, [{"end_time": 5, "start_time": 4}]

При выполнении запроса порядок должен быть следующим:

ad3, [{"end_time": 5, "start_time": 4}]
ad2, [{"end_time": 12, "start_time": 7}, {"end_time": 18, "start_time": 13}]
ad1, [{"end_time": 12, "start_time": 11}, {"end_time": 18, "start_time": 17}]

У меня создана скрипта db для моего сценария. Я читал документацию postgres jsonb, и вот где я достиг:

выберите a. *, Боковой (выберите min ((dp - >> 'start_time') :: int) x from jsonb_array_elements (a.day_parting) dp) t (x) from merchant_ads a join merchant_devices d on not (d.blacklisted_tags && a.tags) и not (d.blacklisted_brands && array [a.brand :: text]), jsonb_array_elements (a.day_parting), где d.device_id = 'device6' и a.active = true и (date (now ()) BETWEEN a.start_date AND a.end_date) упорядочить по x;

Это не работает, и, следовательно, мой вопрос здесь, как мне получить возрастающий порядок, чтобы я упорядочивал строки по start_time значений jsonb.

1 Ответ

1 голос
/ 18 июня 2020

Вы можете использовать предложение ORDER BY следующим образом:

ORDER BY (SELECT min(CAST(j->>'start_time' AS integer))
          FROM jsonb_array_elements(day_parting) AS elem(j))
...