我有一个jsonb列,用于存储一些过滤数据。我在列中存储数据的结构如下所示,
[
{
"filter":[
{
"key":"first_name",
"condition":"has_any_value"
},
{
"key":"count_of",
"value":"1",
"event_id":"130",
}
]
},
{
"filter":[
{
"key":"count_of",
"value":"1",
"event_id":"130"
}
],
"filter_operator":"AND"
},
{
"filter":[
{
"key":"user_id",
"value":"12",
"condition":"equals"
},
{
"key":"count_of",
"value":"112",
"event_id":"130"
],
"filter_operator":"OR"
}
]
我需要查询过滤器JSON是否包含特定事件ID(任何“ filter
”数据中都可能存在),但是我找不到查询特定事件ID是否存在于其中的方法我拥有的结构(数组->每个filter
数据->任何哈希都可能包含事件ID)。我正在使用postgres 10.1。有人可以帮忙吗?
答案 0 :(得分:0)
发布一种可能的方法之前的一件事:请注意,这在性能方面将是非常糟糕的,因为这始终需要您进行全表扫描。具有比我更多DBA经验的人可能知道在此处添加索引的巧妙方法,但是就可维护性而言,还是建议选择稍有不同的方法。
话虽如此,这是我的方法。
with filters as (
select id, jsonb_array_elements(
jsonb_array_elements(my_jsonb_column)->'filter') as filter
from my_table
)
select distinct id from filters where filter @> '{"event_id":"130"}'::jsonb
这将为您提供所有记录的ID,包括事件ID。
以下是演示的小提琴:https://www.db-fiddle.com/f/hMSjM675cqQQnb734V4zne/0