0

I have a jsonb column where I am storing some filtering data. The structure I am storing the data in the column is like the below,

[
      {
        "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"
     }
]

I need to query if the filter JSON contains specific event id(Which may exists in any of the "filter" data), But I can't find a way to query if the specific event Id exists in the structure I have(Array -> each filter data -> Any of hash may contain the event Id). I am using postgres 10.1. Can anyone help to get this?

0

One thing before posting a possible approach: please be aware that this will be extremely bad in terms of performance as this will always require you to do a full table scan. It's possible that someone with more DBA experience than me knows a clever way to add an index here, but in terms of maintainability it might still be preferable to go for a slightly different approach.

Having said that, here's my approach.

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

This will give you the id of all records including the event id.

Here's a fiddle to demo it: https://www.db-fiddle.com/f/hMSjM675cqQQnb734V4zne/0

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.