I have a column of type jsonb[]
(a Postgres array of jsonb
objects) and I’d like to perform a SELECT on rows where a criteria is met on at least one of the objects. Something like:
-- Schema would be something like mytable ( id UUID PRIMARY KEY, col2 jsonb[] NOT NULL ); -- Query I'd like to run SELECT id, x->>'field1' AS field1 FROM mytable WHERE x->>'field2' = 'user' -- for any x in the array stored in col2
I’ve looked around at ANY
and UNNEST
but it’s not totally clear how to achieve this, since you can’t run unnest
in a WHERE
clause. I also don’t know how I’d specify that I want the field1
from the matching object.
Do I need a WITH
table with the values expanded to join against? And how would I achieve that and keep the id
from the other column?
Thanks!
Advertisement
Answer
You need to unnest the array and then you can access each json value
SELECT t.id, c.x ->> 'field1' AS field1 FROM mytable t cross join unnest(col2) as c(x) WHERE c.x ->> 'field2' = 'user'
This will return one row for each json value in the array.