2016-12-30 97 views
0

我的表中有一列「fields」。 它包含了這樣的事情:在postgres中選擇JSON 9.5

{"creative_url": {"required": true, "data_type": "string"}} 

{"creative_name_field": {"required": false, "data_type": "integer"}} 

所以,在主字典不同的密鑰。

我想選擇的所有行:

"required": true 

嘗試類似:

select * 
from my_table 
where fields @> '{"required":true}' 

但它表明我沒有(找到0行)。

Postgres documentation不給我任何其他方法來做到這一點。 什麼問題?

回答

1

@>操作員只檢查頂層。
您可以使用jsonb_object_keys函數獲取jsonb對象的頂級鍵(如果使用json類型,請使用json_object_keys)。

WITH j(json) AS (
    VALUES 
    ('{"creative_url": {"required": true, "data_type": "string"}}'::jsonb), 
    ('{"creative_name_field": {"required": false, "data_type": "integer"}}') 
) 
SELECT 
    json, 
    json->k @> '{"required": true}' AS is_required 
FROM j, jsonb_object_keys(json) s(k) 
; 
┌──────────────────────────────────────────────────────────────────────┬─────────────┐ 
│         json         │ is_required │ 
├──────────────────────────────────────────────────────────────────────┼─────────────┤ 
│ {"creative_url": {"required": true, "data_type": "string"}}   │ t   │ 
│ {"creative_name_field": {"required": false, "data_type": "integer"}} │ f   │ 
└──────────────────────────────────────────────────────────────────────┴─────────────┘ 
(2 rows) 
+0

真的很難理解這個查詢)但它的工作! – Snobby

0

雖然答案已被接受而OP滿意答案但我仍在爲可能需要幫助的人添加解決方案。 看來你有兩個級別的搜索db對象列json。 拿到創紀錄的最簡單的方法是

select * from my_table where fields->'creative_name_field'->>'required'='true' OR fields->'creative_url'->>'required'='true'; 

有這樣做的其他方式,但我沒有測試它

select * from my_table where fields->{'creative_url', 'creative_name_field'}->>'required'='true'; 

這裏有一個陷阱這裏是使用前的父項is_required子鍵檢查。 希望這會有所幫助。

+0

如果我想用'required ='true''選擇所有字段('creative_name_field'和'creative_url'),這個例子將不起作用哦' – Snobby

+0

哦,我錯過了點'所以,主dict.'不同的鍵。但是現在我已經糾正瞭解決方案。 – MaNKuR