Maciej Szopinski
2014-01-21 09:34:43 UTC
Hello,
Does PostgreSQL provide any notation/method for putting a constraint on
each element of a JSON array?
An example to illustrate:
create table orders(data json);
insert into orders values ('
{
"order_id": 45,
"products": [
{
"product_id": 1,
"name": "Book"
},
{
"product_id": 2,
"name": "Painting"
}
]
}
');
I can easily add a constraint on the order_id field:
alter table orders add check ((data->>'order_id')::integer >= 1);
Now I need to do the same with product_id. I can put constraint on
idividual array items:
alter table orders add check ((data->'products'->0->>'product_id')::integer
So what I'm looking for is some kind of wildcard operator for matching any
JSON array element:
alter table orders add check ((data->'products'->*->>'product_id')::integer
I know that this can be done by extracting products to a separate table
with a foreign key to orders. But I want to know if this is possible within
single JSON column, so I can keep that in mind when designing a database
schema.
Does PostgreSQL provide any notation/method for putting a constraint on
each element of a JSON array?
An example to illustrate:
create table orders(data json);
insert into orders values ('
{
"order_id": 45,
"products": [
{
"product_id": 1,
"name": "Book"
},
{
"product_id": 2,
"name": "Painting"
}
]
}
');
I can easily add a constraint on the order_id field:
alter table orders add check ((data->>'order_id')::integer >= 1);
Now I need to do the same with product_id. I can put constraint on
idividual array items:
alter table orders add check ((data->'products'->0->>'product_id')::integer
= 1);
alter table orders add check ((data->'products'->1->>'product_id')::integer= 1);
-- etc.So what I'm looking for is some kind of wildcard operator for matching any
JSON array element:
alter table orders add check ((data->'products'->*->>'product_id')::integer
= 1);
-- ^ like thisI know that this can be done by extracting products to a separate table
with a foreign key to orders. But I want to know if this is possible within
single JSON column, so I can keep that in mind when designing a database
schema.