Så jag frågade den här frågan på postlistan , som föreslagen av Craig Ringer , och jag har svaret.
Kort sagt är lösningen att skriva en procedur som materialiserar JSON-arrayen till PostgreSQL-arrayen:
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 ;
och använd den proceduren i CHECK
uttalande:
alter table orders add check (1 <= ALL(data_product_ids(data)));
För mer information om hur detta fungerar se svaret på PostgreSQL e-postlista . Tack till Joel Hoffman.