Jadi saya menanyakan pertanyaan ini di milis PostgreSQL , sebagai disarankan oleh Craig Ringer , dan saya punya jawabannya.
Singkatnya, solusinya adalah menulis prosedur yang mewujudkan array JSON ke array 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 ;
dan gunakan prosedur itu di CHECK
pernyataan:
alter table orders add check (1 <= ALL(data_product_ids(data)));
Untuk detail lebih lanjut tentang cara kerjanya, lihat jawaban di Milis PostgreSQL . Penghargaan untuk Joel Hoffman.