Как получить значения из массива json объектов в PostgreSQL? - PullRequest
0 голосов
/ 17 июня 2020

У меня есть следующие json:

[
   {
      "transition":"random_word",
      "from":"paris",
      "to":"porto",
      "date":{
         "date":"2020-05-28 11:51:25.201864",
         "timezone_type":3,
         "timezone":"Europe\/Paris"
      }
   },
   {
      "transition":"rainbow",
      "from":"porto",
      "to":"faro",
      "date":{
         "date":"2020-06-06 23:10:06.878539",
         "timezone_type":3,
         "timezone":"Europe\/Paris"
      }
   },
   {
      "transition":"banana",
      "from":"faro",
      "to":"rio_de_janeiro",
      "date":{
         "date":"2020-06-06 23:14:10.975099",
         "timezone_type":3,
         "timezone":"Europe\/Paris"
      }
   },
   {
      "transition":"hello",
      "from":"rio_de_janeiro",
      "to":"buenos_aires",
      "date":{
         "date":"2020-06-06 23:14:15.314370",
         "timezone_type":3,
         "timezone":"Europe\/Paris"
      }
   }
]

Представьте, что я хочу получить последнюю остановку моего путешественника (значение ключа " в "от последнего объекта json. Здесь: buenos_aires) и даты (здесь: 2020-06-06 23: 14: 15.314370).

Как мне действовать, зная, что я хочу сделать это, используя PostgreSQL?

1 Ответ

0 голосов
/ 18 июня 2020

Если под словом «последний» вы подразумеваете порядок, в котором элементы отображаются в массиве, вы можете использовать jsonb_array_length(), чтобы получить длину массива и использовать это для получения последнего элемента:

select (the_json_column -> jsonb_array_length(the_json_column) - 1) ->> 'to' as "to",
       (the_json_column -> jsonb_array_length(the_json_column) - 1) #>> '{date,date}' as "date"
from the_table 

Выражение jsonb_array_length(the_json_column) - 1 вычисляет индекс «последнего» элемента в массиве.

Если ваш столбец определен как json, а не jsonb (как и должно быть), вам необходимо вместо этого использовать эквивалент json_array_length().

...