2017-02-09 12 views
0

У меня есть jsonb поля с массивом, как эта ниже:Postgres извлечь выгоду из jsonb массива

[ 
    { 
     "type":"discount", 
     "title":"Discount 10%" 
    }, 
    {   
     "file":"zx5rP8EoacyfhqGndcSOnP8VYtkr9Ya8Nvf7oYL98YDsM1CLMYIurYvfVUU4AGkzBsovwssT0bq.pdf", 
     "type":"menu", 
     "title":"Some menu title etc" 
    } 
] 

Я хочу, чтобы получить файл атрибута в случае существует типа = меню в массив.

Что мне удалось сделать, это знать, есть ли он, но как я могу в конечном итоге извлечь значение файла?

case when offers @> '[{"type":"menu"}]' then true else false end 

Я не хочу делать что-то вроде этого ниже, потому что массив не может содержать тип скидки.

offers->1->'file' 
+0

попробовать 'json_array_elements' для этого .. –

+0

не @VaoTsun не повезло там – mallix

ответ

1

jsob_array_elements() Использование и ->> оператора (см JSON Functions and Operators.)

with a_table(json_col) as (
values (
'[ 
    { 
     "type":"discount", 
     "title":"Discount 10%" 
    }, 
    {   
     "file":"zx5rP8EoacyfhqGndcSOnP8VYtkr9Ya8Nvf7oYL98YDsM1CLMYIurYvfVUU4AGkzBsovwssT0bq.pdf", 
     "type":"menu", 
     "title":"Some menu title etc" 
    } 
]'::jsonb) 
) 

select value->>'file' as filename 
from a_table, 
lateral jsonb_array_elements(json_col) 
where value->>'type' = 'menu' 

            filename          
--------------------------------------------------------------------------------- 
zx5rP8EoacyfhqGndcSOnP8VYtkr9Ya8Nvf7oYL98YDsM1CLMYIurYvfVUU4AGkzBsovwssT0bq.pdf 
(1 row) 
+0

почему вы используете боковые, а не простые jsonb_array_elements? – mallix

+0

Функции, возвращающие набор строк, должны вызываться в предложении 'FROM', а боковое соединение - естественный способ сделать это. – klin

1

Например:

t=# with a as (with v as (select '[ 
    { 
     "type":"discount", 
     "title":"Discount 10%" 
    }, 
    { 
     "file":"zx5rP8EoacyfhqGndcSOnP8VYtkr9Ya8Nvf7oYL98YDsM1CLMYIurYvfVUU4AGkzBsovwssT0bq.pdf", 
     "type":"menu", 
     "title":"Some menu title etc" 
    } 
]'::jsonb j) 
select jsonb_array_elements(j) r from v) select r->>'file' from a where r->>'type' = 'menu'; 
            ?column? 
--------------------------------------------------------------------------------- 
zx5rP8EoacyfhqGndcSOnP8VYtkr9Ya8Nvf7oYL98YDsM1CLMYIurYvfVUU4AGkzBsovwssT0bq.pdf 
(1 row) 
Смежные вопросы