我的表格中有一列“字段”。 它包含这样的内容:
{"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没有给我任何其他方法来执行此操作。 有什么问题?
答案 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
子键检查之前使用父键。
希望这会有所帮助。