Nuestro grupo especializado luego de algunos días de trabajo y recopilación de de información, encontramos los datos necesarios, nuestro deseo es que todo este artículo sea de gran utilidad en tu plan.
Solución:
Actualizar: para 9.5+, hay operadores explícitos que puede usar con jsonb
(Si tienes un json
columna escrita, puede usar conversiones para aplicar una modificación):
Borrando un key (o un índice) de un objeto JSON (o, de un array) se puede hacer con el -
operador:
SELECT jsonb '"a":1,"b":2' - 'a', -- will yield jsonb '"b":2'
jsonb '["a",1,"b",2]' - 1 -- will yield jsonb '["a","b",2]'
La eliminación, desde lo profundo de una jerarquía JSON, se puede hacer con el #-
operador:
SELECT '"a":[null,"b":[3.14]]' #- 'a,1,b,0'
-- will yield jsonb '"a":[null,"b":[]]'
Para 9.4, puede usar una versión modificada de la respuesta original (a continuación), pero en lugar de agregar un JSON stringpuede agregar en un json
objeto directamente con json_object_agg()
.
Relacionado: otras manipulaciones de JSON dentro de PostgreSQL:
- ¿Cómo modifico campos dentro del nuevo tipo de datos PostgreSQL JSON?
respuesta original (se aplica a PostgreSQL 9.3):
Si tiene al menos PostgreSQL 9.3, puede dividir su objeto en pares con json_each()
y filtre sus campos no deseados, luego vuelva a construir el json manualmente. Algo como:
SELECT data::text::json AS before,
('')::json AS after
FROM (VALUES ('"attrA":1,"attrB":true,"attrC":["a","b","c"]'::json)) AS v(data),
LATERAL (SELECT * FROM json_each(data) WHERE "key" <> 'attrB') AS l
GROUP BY data::text
Con 9.2 (o inferior) no es posible.
Editar:
Una forma más conveniente es crear una función, que puede eliminar cualquier número de attributes en un json
campo:
Editar 2: string_agg()
es menos costoso que array_to_string(array_agg())
CREATE OR REPLACE FUNCTION "json_object_delete_keys"("json" json, VARIADIC "keys_to_delete" TEXT[])
RETURNS json
LANGUAGE sql
IMMUTABLE
STRICT
AS $function$
SELECT COALESCE(
(SELECT (' "value", ',') ')
FROM json_each("json")
WHERE "key" <> ALL ("keys_to_delete")),
''
)::json
$function$;
Con esta función, todo lo que necesita hacer es ejecutar la consulta a continuación:
UPDATE my_table
SET data = json_object_delete_keys(data, 'attrB');
Esto se ha vuelto mucho más fácil con PostgreSQL 9.5 usando el tipo JSONB. Vea los operadores JSONB documentados aquí.
Puede eliminar un nivel superior attribute con el operador “-“.
SELECT '"a": "key":"value", "b": 2, "c": true'::jsonb - 'a'
// -> "b": 2, "c": true
Puede usar esto dentro de una llamada de actualización para actualizar un campo JSONB existente.
UPDATE my_table SET data = data - 'attrB'
También puede proporcionar la attribute nombre dinámicamente a través de un parámetro si se usa en una función.
CREATE OR REPLACE FUNCTION delete_mytable_data_key(
_id integer,
_key character varying)
RETURNS void AS
$BODY$
BEGIN
UPDATE my_table SET
data = data - _key
WHERE id = _id;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
El operador inverso es el “||”, para concatenar dos paquetes JSONB juntos. Tenga en cuenta que el uso más a la derecha de la attribute sobrescribirá los anteriores.
SELECT '"a": true, "c": true'::jsonb || '"a": false, "b": 2'::jsonb
// -> "a": false, "b": 2, "c": true
no pude conseguir SELECT '"a": "b"'::jsonb - 'a';
para trabajar en 9.5.2. Sin embargo, SELECT '"a": "b"'::jsonb #- 'a';
funcionó!
Comentarios y calificaciones
Si para ti ha resultado de ayuda este post, sería de mucha ayuda si lo compartes con el resto juniors de esta manera nos ayudas a extender este contenido.