そこで、PostgreSQLメーリングリストでこの質問をしましたCraigRingerによる提案 、そして私は答えを持っています。
要するに、解決策は、JSON配列を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 ;
CHECK
でその手順を使用します 声明:
alter table orders add check (1 <= ALL(data_product_ids(data)));
これがどのように機能するかの詳細については、 PostgreSQLメーリングリスト 。 JoelHoffmanのクレジット。