Получение данных из любых элементов массива

#postgresql-9.5

#postgresql-9.5

Вопрос:

PosgreSQL 9.5

Тип поля: jsonb

Здесь json

 {
  "options": [
    {
      "name": "method"
    },
    {
      "name": "flavor"
    },
    {
      "name": "weight",
      "value": {
        "name": "300g"
      }
    }
  ]
}
  

И вот запрос, который получает значение элемента (вес) с индексом = 2 из массива:

 SELECT 
id, 
product.data #>'{title,en}' AS title_en,
product.data #>>'{options, 2, value, name }' as options_weight_value
FROM product 
  

Неплохо. Все работает нормально.

Но проблема в том, что вес может быть в любом индексе в массиве. Первый или второй и так далее.

Итак, мне нужно получить значение name (300g) в узле «weight». Мне нужен smt, подобный этому:

   SELECT 
    id, 
    product.data #>'{title,en}' AS title_en,
    product.data #>>'{options, *, value, name, weight }' as options_weight_value
    FROM product 
  

Возможно ли это?

Комментарии:

1. Можете ли вы изменить структуру JSON? Было бы намного эффективнее сделать что-то вроде {"method": "...", "flavor": "...", "weight": "300g"}

2. @a_horse_with_no_name Нет, я не могу изменить json.

3. @a_horse_with_no_name Я добавил свое решение

Ответ №1:

Я думаю, что нашел решение:

 SELECT 
id,
p.data #>'{title,en}' AS title_en,
p.data #>'{weight,qty}' AS weight_qty,
(select * 
from jsonb_array_elements(p.data -> 'options') AS options_array
where 
 options_array ->> 'name' = 'weight'
) #>'{value,name}' as options_weight
from product p
  

А теперь найдите значение веса (если оно существует) в любом элементе массива. В этом примере это = 300g