¿Cómo anteponer / insertar un elemento en una matriz jsonb en PostgreSQL 12?

Sep 08 2020

Ejemplo:

drop table a;
create table a( value jsonb);
insert into a values ('{"items":[0,1,2]}'::jsonb);
select value->'items' from a;

Ya sé cómo agregar a una matriz. Por ejemplo:

select jsonb_build_object('items', 
        value->'items' || '3'::jsonb
)  from a

Esto devuelve:

{"items": [0, 1, 2, 3]}

Pero no sé cómo preprendar o insertar un elemento en una matriz.

Por ejemplo:

select jsonb_build_object('items', 
        jsonb_array_insert(value->'items',0,-1)
)  from a

Y esto volvería:

{"items": [-1, 0, 1, 2]}

Pero no hay jsonb_array_insertfunción. La documentación enhttps://www.postgresql.org/docs/12/functions-json.html (Tabla 9.45. Operadores jsonb adicionales) describe algunos operadores jsonb útiles, pero ninguno de ellos se puede usar para insertar / anteponer elementos.

Bueno, jsonb_array_elements(value->'items')se puede usar para convertir una matriz en un conjunto de elementos. Pero no veo cómo podría usarse para insertar / anteponer elementos en la matriz.

Posiblemente podría escribir mi propia función PL / SQL para esto, ¡pero debe haber una manera mejor!

Respuestas

2 AkhileshMishra Sep 08 2020 at 16:25

Puede utilizarlo JSONB_INSERTpara lograr lo que desea. Consulte la documentación .

Pruébelo de esta manera:

select 
jsonb_insert(value,'{items,0}','-1'::jsonb)
from a

Esta función funciona exactamente según sus necesidades.