Затова зададох този въпрос в пощенския списък на PostgreSQL , като предложено от Крейг Рингър и имам отговора.
Накратко, решението е да се напише процедура, която материализира JSON масив в PostgreSQL масив:
create function data_product_ids(JSON) returns integer[] immutable as $$
select array_agg((a->>'product_id')::integer) from
json_array_elements($1->'products') as a $$ language sql ;
и използвайте тази процедура в CHECK
изявление:
alter table orders add check (1 <= ALL(data_product_ids(data)));
За повече подробности как работи това вижте отговора на Пощенски списък на PostgreSQL . Благодарение на Джоел Хофман.