Выбрать во вложенном jsonb - postgresql - PullRequest
0 голосов
/ 04 августа 2020

Мне было сложно найти значения на основе, так как все примеры цитируют один и тот же способ поиска информации в простых jsons.

Но друг с работы дал мне решение, и я пришел поделиться .

первоначальный вопрос был: Как сделать выбор во вложенном json ???

A json вот так:

{
   "vehicle":[
      {
         "vehicle_type":"Truck",
         "car_make":"Lotus",
         "car_model":"Esprit",
         "quantity":7,
         "seats":7,
         "price_hour":16,
         "price_day":147,
         "color":[
            "Purple",
            "Pink",
            "Blue",
            "White"
         ]
      }
   ]
}

Для просмотра структуру, вы можете использовать https://jsoneditoronline.org/

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Для определения транспортного средства с синий цвет и типа транспортного средства с SUV , jsonb_array_elements() может использоваться функция чтобы разложить основной массив, а затем поместить (j.elm->>'vehicle_type') = 'SUV' в предложение WHERE, будет достаточно для второго, а (j.elm->>'color')::jsonb ? 'Blue' следует использовать, содержащий jsonb преобразование с оператором ? для первого, поскольку (j.elm->>'color') извлекает массив, а (j.elm->>'vehicle_type') выполняет простые строковые части.

Поэтому регулярное выражение не требуется, например, запросы ниже:

SELECT e.*
  FROM example e
 CROSS JOIN jsonb_array_elements(jsonTest->'vehicle') j(elm)
 WHERE (j.elm->>'color')::jsonb ? 'Blue'

и

SELECT e.*
  FROM example e
 CROSS JOIN jsonb_array_elements(jsonTest->'vehicle') j(elm)
 WHERE (j.elm->>'vehicle_type') = 'SUV'

Демо

0 голосов
/ 04 августа 2020

В ответе, который я привожу, используется select с регулярным выражением:

select * from example
where example.jsonTest->>'vehicle' ~ 'color"\s*:\s*"?.*?Blue.*"?';

и

select * from example
where example.jsonTest->>'vehicle' ~ 'vehicle_type"\s*:\s*"?.*?SUV.*"?';

Для ясности я оставил рабочий пример в https://rextester.com/BQZP48785

** извините за мой плохой английский sh

...