在postgres 9.5中选择JSON

时间:2016-12-30 14:22:01

标签: json postgresql

我的表格中有一列“字段”。 它包含这样的内容:

{"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没有给我任何其他方法来执行此操作。 有什么问题?

2 个答案:

答案 0 :(得分:1)

@>运算符仅在顶级检查 您可以使用jsonb_object_keys函数获取jsonb对象的顶级键(如果您使用的是json_object_keys类型,请使用json。)

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)

答案 1 :(得分: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子键检查之前使用父键。 希望这会有所帮助。