CodeGym /Cursos /SQL SELF /Modificando datos en arrays: array_append()...

Modificando datos en arrays: array_append(), array_remove()

SQL SELF
Nivel 35 , Lección 3
Disponible

A veces no solo necesitas leer arrays, sino también cambiarlos: añadir un nuevo valor, quitar uno viejo, actualizar el contenido. Por suerte, en PostgreSQL tienes funciones especiales que te permiten gestionar arrays fácilmente sin tener que reescribirlos a mano: array_append() y array_remove(). Vamos a ver cómo funcionan.

Añadiendo elementos a un array con array_append()

La función array_append() se usa para añadir un nuevo elemento al final de un array. Recibe dos argumentos:

  1. El array original que quieres modificar.
  2. El valor que quieres añadir al array.

Ejemplo 1: Array simple de números

Supón que tienes una tabla projects con una columna team_members, donde se guardan arrays de identificadores de usuarios que trabajan en el proyecto.

CREATE TABLE projects (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    team_members INT[]
);

-- Añadimos algunas filas
INSERT INTO projects (name, team_members)
VALUES
('Proyecto A', ARRAY[1, 2, 3]),
('Proyecto B', ARRAY[4, 5]);

Ahora tenemos el proyecto "Proyecto A" y queremos añadir un nuevo miembro con identificador 7 al array team_members. Usamos array_append():

UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Proyecto A';

-- Comprobamos el resultado:
SELECT * FROM projects;

Resultado:

id name team_members
1 Proyecto A {1,2,3,7}
2 Proyecto B {4,5}

Como ves, el miembro con ID 7 se añadió al array sin problemas!

Ejemplo 2: Añadiendo elementos de texto

El mismo array_append() se puede usar con arrays de otros tipos. Por ejemplo, vamos a añadir una nueva categoría al array de categorías de productos.

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    categories TEXT[]
);

-- Añadimos un producto con categorías
INSERT INTO products (name, categories)
VALUES
('Smartphone', ARRAY['Electrónica', 'Gadgets']),
('Portátil', ARRAY['Ordenadores', 'Electrónica']);

-- Añadimos la nueva categoría "Popular" para el "Smartphone"
UPDATE products
SET categories = array_append(categories, 'Popular')
WHERE name = 'Smartphone';

-- Comprobamos el resultado:
SELECT * FROM products;

Resultado:

id name categories
1 Smartphone {Electrónica,Gadgets,Popular}
2 Portátil {Ordenadores,Electrónica}

Eliminando elementos de un array con array_remove()

Si array_append() es como añadir una nueva tarea a una lista, array_remove() es la herramienta para tachar una tarea ya hecha. Esta función recibe como argumentos:

  1. El array original.
  2. El valor que quieres eliminar.

Ejemplo 1: Eliminando un elemento de un array de números

Volvamos a la tabla projects. Descubrimos que el miembro con ID 7 ya no trabaja en el "Proyecto A". Lo quitamos del array team_members:

UPDATE projects
SET team_members = array_remove(team_members, 7)
WHERE name = 'Proyecto A';

-- Comprobamos el resultado:
SELECT * FROM projects;

Resultado:

id name team_members
1 Proyecto A {1,2,3}
2 Proyecto B {4,5}

La función array_remove() eliminó correctamente al miembro con ID 7.

Ejemplo 2: Eliminando un elemento de texto

Ahora vamos a la tabla products. Si la categoría "Popular" ya no es relevante para el smartphone, la podemos quitar:

UPDATE products
SET categories = array_remove(categories, 'Popular')
WHERE name = 'Smartphone';

-- Comprobamos el resultado:
SELECT * FROM products;

Resultado:

id name categories
1 Smartphone {Electrónica,Gadgets}
2 Portátil {Ordenadores,Electrónica}
Importante:

si el elemento que intentas eliminar no está en el array, array_remove() deja el array sin cambios. Esto es muy cómodo porque no genera ningún error.

Combinando array_append() y array_remove()

A veces necesitas asegurarte primero de que un elemento no está en el array antes de añadirlo. Puedes hacerlo combinando funciones:

Ejemplo: Añadiendo elementos únicos

Vamos a asegurarnos de que el miembro con ID 7 solo se añade al array si aún no está. Para eso usamos una comprobación con array_remove():

UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Proyecto A' AND NOT (team_members @> ARRAY[7]);

-- Comprobamos el resultado:
SELECT * FROM projects;

Explicación:

  • El operador @> comprueba si el array contiene el elemento 7.
  • Si team_members ya tiene el 7, no se añade nada.

Errores típicos y recomendaciones

1. Intentar añadir NULL a un array. Si intentas usar array_append() con NULL (por ejemplo, array_append(team_members, NULL)), esto añadirá un valor NULL al array. No dará error, pero el resultado puede no ser lo que esperabas. Para evitarlo, comprueba antes de añadir que el valor no sea NULL.

-- Ejemplo de comprobación:
UPDATE projects
SET team_members = array_append(team_members, COALESCE(NULL, -1))
WHERE name = 'Proyecto A';

2. Tipos de datos diferentes en el array. Los arrays en PostgreSQL deben tener valores del mismo tipo. Por ejemplo, no puedes añadir una cadena a un array de números:

-- Esto dará error:
UPDATE projects
SET team_members = array_append(team_members, 'ejemplo');

Para evitarlo, asegúrate de que los tipos de datos coinciden. Si tienes dudas, convierte el valor al tipo correcto usando :::

-- Ejemplo de conversión de tipos:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION