PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Existe-t-il un moyen d'adresser tous les éléments du tableau JSON lors de la création d'une contrainte dans PostgreSQL ?

J'ai donc posé cette question sur la liste de diffusion PostgreSQL , comme suggéré par Craig Ringer , et j'ai la réponse.

En bref la solution est d'écrire une procédure qui matérialise le tableau JSON en tableau 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 ;

et utilisez cette procédure dans CHECK déclaration :

alter table orders add check (1 <= ALL(data_product_ids(data)));

Pour plus de détails sur la façon dont cela fonctionne, voir la réponse sur Liste de diffusion PostgreSQL . Crédits à Joel Hoffman.