PostgreSQL JSON - Подмножество вложенных списков - PullRequest
0 голосов
/ 10 октября 2018

У меня есть столбец в базе данных PostgreSQL, который в основном представляет собой jsonified список кортежей python:

[
  ["Mobile","111-111-1111"],
  ["Office","222-222-2222"],
  ["Mobile","333-333-3333"],
  ["Fax","444-444-4444"],
]

Я хотел бы создать запрос, который возвращает подмножество списка на основе первого значенияв каждом из вложенных списков.Ниже приведен псевдо-запрос, который, как мы надеемся, проиллюстрирует то, что мне нужно:

SELECT
  foo AS bar,
  (SELECT 
     element 
   FROM 
     phone_numbers 
   WHERE
     element::json->>0 = "Mobile") AS mobile_numbers
FROM
  db
;

mobile_numbers == [["Mobile","111-111-1111"],["Mobile","333-333-3333"]]

Я знаю только кусочки об операторах json в PostgreSQL (и SQL-запросах в целом), в основном в терминах словарей.Здесь можно найти много примеров того, как копаться во вложенных словарях и возвращать одно значение, но я не нашел ничего, что бы соответствовало тому, что я ищу.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 11 октября 2018

Предполагая, что столбец содержит действительный json в качестве массива массивов, вы должны развернуть внешний массив с помощью jsonb_array_elements(), отфильтровав внутренние массивы (кортежи) по первым (индекс 0) ихэлементы и совокупные результаты с jsonb_agg().

with my_table(phone_numbers) as (
values
('[
  ["Mobile","111-111-1111"],
  ["Office","222-222-2222"],
  ["Mobile","333-333-3333"],
  ["Fax","444-444-4444"]
]'::jsonb)
)

select jsonb_agg(phone)
from my_table
cross join jsonb_array_elements(phone_numbers) as arr(phone)
where phone->>0 = 'Mobile'

                        jsonb_agg                         
----------------------------------------------------------
 [["Mobile", "111-111-1111"], ["Mobile", "333-333-3333"]]
(1 row) 
...