Tak jsem položil tuto otázku na poštovním seznamu Postgresql.com , jako navrhl Craig Ringer , a mám odpověď.
Stručně řečeno, řešením je napsat proceduru, která zhmotní pole JSON do pole 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 ;
a použijte tento postup v CHECK
prohlášení:
alter table orders add check (1 <= ALL(data_product_ids(data)));
Další podrobnosti o tom, jak to funguje, najdete na PostgreSQL mailing list . Poděkování Joelu Hoffmanovi.