Cómo no tener una restricción nula dentro de una columna jsonb en Postgres.
Creé una tabla de Postgres con solo una columna llamada id como esta a continuación
create table tablea ( id jsonb, check ((id->>'test1', id->>'test2') != (null, null)) );La persona que llama insertará datos en la tabla en el siguiente formato json: -
[ { "test1":"", "test2":"", "test3":"" }, { "test1":"", "test2":"", "test3":"" } ]Mi objetivo es que cuando una persona que llama inserte datos en la columna de identificación, quiero que la clave test1 y test2 no sean nulas. ¿Cómo se puede lograr eso? La lógica de creación de mi tabla se explica arriba. Estoy tratando de insertar datos como
insert into tablea(id) values ('[{"test1":null,"test2":"a","test3":""}]');Idealmente, esta declaración de inserción debería arrojarme un error, pero está insertando datos en la tabla. Puede alguien ayudarme
Deberá crear una función que itere a través de su matriz y valide cada elemento de la matriz.
Algo como esto:
create or replace function validate_json(p_input jsonb) returns boolean as $$ select not exists (select * from jsonb_array_elements(p_input) as t(element) where nullif(element ->> 'test1', '') is null or nullif(element ->> 'test2', '') is null); $$ language sql stable;Luego puede usarlo para definir una restricción de verificación:
No puede comparar null con = o <> . Necesitas usar IS NOT NULL para eso.
También parece que desea tratar una cadena vacía de la misma manera que nula.
create table tablea ( id jsonb, constraint check_json check ( validate_json(id) ) );