2017-02-09 8 views
0

Ich habe ein jsonb Feld mit einem Array wie diese unter:Postgres extrahieren Wert von jsonb Array

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

ich dort die Datei Attribut erhalten, falls wollen, ist ein type = Menü in der Array.

Was ich geschafft habe, ist zu wissen, ob es einen gibt, aber wie kann ich schließlich den Dateiwert extrahieren?

Ich möchte nicht so etwas tun, da das Array möglicherweise keinen Rabatttyp enthält.

offers->1->'file' 
+0

Versuch 'json_array_elements' für dieses .. –

+0

@VaoTsun kein Glück dort – mallix

Antwort

1

Verwenden jsob_array_elements() und ->> Operator (siehe 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

warum tun Sie verwenden laterale anstelle von plain jsonb_array_elements? – mallix

+0

Funktionen, die Zeilen zurückgeben, sollten in der 'FROM'-Klausel aufgerufen werden, und lateraler Join ist ein natürlicher Weg, dies zu tun. – klin

1

Eg:

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) 
Verwandte Themen