sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Hay alguna forma de abordar todos los elementos de la matriz JSON al crear una restricción en PostgreSQL?

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.