Så jeg stillede dette spørgsmål på postlisten , som foreslået af Craig Ringer , og jeg har svaret.
Kort sagt er løsningen at skrive en procedure, som materialiserer JSON-array til 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 ;
og brug denne procedure i CHECK
udsagn:
alter table orders add check (1 <= ALL(data_product_ids(data)));
For flere detaljer om, hvordan dette fungerer, se svaret på PostgreSQL-mailingliste . Kredit til Joel Hoffman.