2017-02-09 95 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)