2016-10-11 3 views
0

Suchen nach einem Platzhalter-Operator zum Abfragen von JSONB-Datentypen. Zum Beispiel mit diesem:Platzhalter in JSONB

$> Campaign.find(43).style_item_map 

{"0"=>{"items"=>[876, 875], "style"=>"First", "featured"=>[876, 875]}, "1"=>{"items"=>[999, 998], "style"=>"Secondary", 
"featured"=>[]}} 

für eine Abfrage wie folgt aussehen: (% hier nicht funktioniert)

Campaign.where("style_item_map @> '{\"%\":{\"items\": [876]}}'") 

Antwort

1

Ich nehme an, Sie jsonb_each zweimal für diese Art von Dokument verwenden müssen:

WITH t(style_item_map) AS (VALUES 
    ('{ 
    "0": { 
    "items":[876, 875], 
    "style":"First", 
    "featured":[876, 875] 
    }, 
    "1": { 
    "items":[999, 998], 
    "style":"Secondary", 
    "featured":[] 
    } 
}'::JSONB) 
) 
SELECT 
    item.key, 
    inner_item 
FROM t, 
    jsonb_each(t.style_item_map) item, 
    jsonb_each(item.value) inner_item 
WHERE 
    inner_item.key = 'items' 
AND 
    inner_item.value @> '[876]'; 

Ergebnis:

key |  inner_item  
-----+---------------------- 
0 | (items,"[876, 875]") 
(1 row)