#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