Dus ik stelde deze vraag op Postgres.gmail.com">SQL-mailinglijst , als voorgesteld door Craig Ringer , en ik heb het antwoord.
In het kort is de oplossing om een procedure te schrijven die JSON-array materialiseert naar PostgreSQL-array:
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 ;
en gebruik die procedure in CHECK
verklaring:
alter table orders add check (1 <= ALL(data_product_ids(data)));
Voor meer details over hoe dit werkt, zie het antwoord op PostgreSQL-mailinglijst . Met dank aan Joel Hoffman.