Query for element of array in JSON column
Yes, that's possible:
SELECT *FROM tbl t, json_array_elements(t.json_col->'emails') AS elemWHERE elem->>'id' = 123;
tbl
being your table name, json_col
being the name of the JSON column.
More details in this related answer:
More about the implicit CROSS JOIN LATERAL
in the last paragraph of this related answer:
Index to support this kind of query:
With a JSONB column in Postgres 9.4+ you can use the contains operator @>
to query for an element in an array:
SELECT * FROM jsontest WHERE data @> '{ "emails": [{ "id": "123" }] }';
See Query for array elements inside JSON type for more details.
Here is a working example:
CREATE TABLE jsontest(data JSONB NOT NULL);INSERT INTO jsontest VALUES ( '{ "name": "foo", "id": "123", "emails": [ { "address": "somethinghere", "id": "123" }, { "address": "soemthing", "id": "456" } ] }');SELECT * FROM jsontest WHERE data @> '{ "emails": [{ "id": "123" }] }';data----{"id": "123", "name": "foo", "emails": [{"id": "123", "address": "somethinghere"}, {"id": "456", "address": "soemthing"}]}
(1 row)
Came across this post and found that you can directly query on table like this:
SELECT *FROM table_name, json_array_elements(json_column) AS dataWHERE data->>'id' = 123;
Omitting this part:
json_array_elements(t.json_col->'emails')