PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gibt es eine Möglichkeit, alle Elemente des JSON-Arrays zu adressieren, wenn eine Einschränkung in PostgreSQL erstellt wird?

Also habe ich diese Frage auf der PostgreSQL-Mailingliste gestellt , als vorgeschlagen von Craig Ringer , und ich habe die Antwort.

Kurz gesagt besteht die Lösung darin, eine Prozedur zu schreiben, die ein JSON-Array in ein PostgreSQL-Array materialisiert:

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 ;

und verwenden Sie diese Prozedur in CHECK Anweisung:

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

Weitere Einzelheiten dazu, wie dies funktioniert, finden Sie in der Antwort auf PostgreSQL-Mailingliste . Dank an Joel Hoffman.