2016-12-30 69 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