Búsqueda dentro de arrays
Operadores ANY, de inclusión y de solapamiento
Búsqueda dentro de arrays es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
Los arrays almacenan varios valores
En PostgreSQL, una columna de tipo array contiene varios valores en una sola celda. Antes de buscar dentro de los arrays, resulta útil ver qué aspecto tienen.
La consulta siguiente crea una tabla en la que cada producto puede pertenecer a varias categorías almacenadas como un array de texto.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT,
tags TEXT[]
);
INSERT INTO products (name, tags) VALUES
('Laptop', ARRAY['electronics', 'computers', 'sale']),
('T-Shirt', ARRAY['clothing', 'summer', 'sale']),
('Coffee Mug', ARRAY['kitchen', 'gifts']),
('Headphones', ARRAY['electronics', 'audio']),
('Notebook', ARRAY['stationery', 'office']);Comprobar pertenencia con ANY
El operador ANY permite comprobar si un valor aparece en algún lugar de un array. La sintaxis es: value = ANY(array_column).
Esta consulta busca todos los productos etiquetados como electronics.
SELECT name, tags
FROM products
WHERE 'electronics' = ANY(tags);ANY no se limita al texto
ANY funciona con cualquier tipo de datos que admita la igualdad. Aquí se muestra una tabla de puntuaciones almacenadas como arrays de enteros. La consulta obtiene los estudiantes que lograron una puntuación perfecta de 100 en al menos una prueba.
CREATE TABLE students (
student TEXT,
scores INT[]
);
INSERT INTO students VALUES
('Alice', ARRAY[88, 95, 100]),
('Bob', ARRAY[70, 80, 90]),
('Carol', ARRAY[100, 100, 99]);
SELECT student, scores
FROM students
WHERE 100 = ANY(scores);Excluir filas con NOT + ANY
Para buscar filas en las que un valor no aparezca en un array, combine NOT con ANY. Tenga en cuenta que value <> ANY(arr) tiene un significado diferente: devuelve verdadero si algún elemento es distinto, lo que casi siempre se cumple.
Use NOT (value = ANY(arr)) para realizar una comprobación de exclusión fiable.
-- Find products that are NOT tagged as 'sale'
SELECT name, tags
FROM products
WHERE NOT ('sale' = ANY(tags));El operador de inclusión @>
El operador @> comprueba si un array contiene todos los elementos de otro. Piense en él como la pregunta: ¿el array de la izquierda incluye todos los elementos enumerados a la derecha?
Esto busca los productos que tienen tanto la etiqueta electronics como la etiqueta sale.
SELECT name, tags
FROM products
WHERE tags @> ARRAY['electronics', 'sale'];El operador de contenido <@
El operador <@ es el inverso de @>. Comprueba si el array de la izquierda está contenido por completo en el array de la derecha.
Esta consulta busca los productos cuya lista completa de etiquetas es un subconjunto del conjunto electronics, computers, sale.
SELECT name, tags
FROM products
WHERE tags <@ ARRAY['electronics', 'computers', 'sale'];El operador de solapamiento &&
El operador && devuelve verdadero cuando dos arrays comparten al menos un elemento. Es el equivalente para arrays de preguntar si estas dos listas tienen algo en común.
La consulta siguiente busca los productos que comparten al menos una etiqueta con una lista de compras determinada.
SELECT name, tags
FROM products
WHERE tags && ARRAY['audio', 'summer', 'gifts'];Solapamiento frente a inclusión: diferencia clave
Es fácil confundir @> y &&. Esta es una comparación clara:
tags @> ARRAY['a','b']— la fila debe tener tanto 'a' como 'b'.tags && ARRAY['a','b']— la fila necesita al menos uno de 'a' o 'b'.
-- Contains: must have BOTH 'electronics' AND 'sale'
SELECT name FROM products WHERE tags @> ARRAY['electronics', 'sale'];
-- Overlap: must have AT LEAST ONE of 'electronics' or 'sale'
SELECT name FROM products WHERE tags && ARRAY['electronics', 'sale'];Usar array_length para filtrar por tamaño
A veces querrá buscar filas en las que el array tenga un número determinado de elementos. array_length(arr, 1) devuelve el número de elementos de la primera dimensión.
Esta consulta busca productos con exactamente tres etiquetas.
SELECT name, tags
FROM products
WHERE array_length(tags, 1) = 3;Combinar búsquedas en arrays con otras condiciones
Los operadores de arrays funcionan junto con las condiciones SQL habituales. Puede combinarlos con AND, OR y cualquier otro predicado de la cláusula WHERE para crear filtros precisos.
-- Products tagged 'sale' AND whose name starts with a letter before 'N'
SELECT name, tags
FROM products
WHERE 'sale' = ANY(tags)
AND name < 'N'
ORDER BY name;Indexar arrays para mejorar el rendimiento
En tablas grandes, las búsquedas en arrays pueden ser lentas sin un índice. El índice GIN (Generalized Inverted Index) de PostgreSQL está diseñado para columnas de tipo array y admite eficazmente los operadores @>, <@ y &&.
ANY no utiliza directamente un índice GIN, pero los operadores de solapamiento e inclusión sí lo hacen.
-- Create a GIN index on the tags array column
CREATE INDEX idx_products_tags ON products USING GIN (tags);
-- This query can now use the index
SELECT name FROM products WHERE tags @> ARRAY['electronics'];Comprobación rápida: operadores de arrays
Compruebe sus conocimientos sobre los operadores de búsqueda en arrays de PostgreSQL.
Resumen de la lección
En esta lección aprendió tres formas fundamentales de buscar dentro de arrays de PostgreSQL:
- = ANY(arr) — comprueba si un valor individual existe en algún lugar del array.
- @> (inclusión) — comprueba que el array incluya todos los elementos especificados.
- && (solapamiento) — comprueba que el array comparta al menos un elemento con otro array.
También vio <@ para comprobar la inclusión inversa, array_length para filtrar por tamaño y el índice GIN para acelerar las búsquedas en arrays de grandes conjuntos de datos. Combinar estos operadores con condiciones WHERE estándar le proporciona un control preciso y expresivo sobre los datos multivaluados.
Preguntas frecuentes
¿La lección «Búsqueda dentro de arrays» es gratis?
Sí — el texto completo de «Búsqueda dentro de arrays» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Búsqueda dentro de arrays»?
Operadores ANY, de inclusión y de solapamiento Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Búsqueda dentro de arrays»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Conceptos básicos de las columnas de arrays
- Búsqueda dentro de arrays
- UNNEST y agregación
- Arrays frente a tablas normalizadas