Así que hice esta pregunta en la lista de correo de PostgreSQL , como sugerido por Craig Ringer , y tengo la respuesta.
En resumen, la solución es escribir un procedimiento que materialice una matriz JSON en una matriz 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 ;
y use ese procedimiento en CHECK
declaración:
alter table orders add check (1 <= ALL(data_product_ids(data)));
Para obtener más detalles sobre cómo funciona, consulta la respuesta en Lista de correo de PostgreSQL . Créditos a Joel Hoffman.