Предоставляет ли PostgreSQL какую-либо нотацию/метод для наложения ограничения на каждый элемент массива JSON?
Пример:
create table orders(data json);
insert into orders values ('
{
"order_id": 45,
"products": [
{
"product_id": 1,
"name": "Book"
},
{
"product_id": 2,
"name": "Painting"
}
]
}
');
Я могу легко добавить ограничение на поле order_id
:
alter table orders add check ((data->>'order_id')::integer >= 1);
Теперь мне нужно сделать то же самое с product_id
. Я могу установить ограничение на отдельные элементы массива:
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.
Итак, очевидно, что я ищу какой-то оператор подстановочных знаков для соответствия любому элементу массива JSON:
alter table orders add check ((data->'products'->*->>'product_id')::integer >= 1);
-- ^ like this
Я знаю, что это можно сделать, извлекая продукты в отдельную таблицу products
с внешним ключом на orders
. Но я хочу знать, возможно ли это в пределах одного столбца JSON, поэтому я могу помнить об этом при разработке схемы базы данных.