Pesquisando dentro de matrizes
Operadores ANY, de contém e de sobreposição.
Pesquisando dentro de matrizes é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
As matrizes armazenam vários valores
No PostgreSQL, uma coluna de matriz contém vários valores em uma única célula. Antes de pesquisar dentro de matrizes, é útil ver qual é a aparência delas.
A consulta abaixo cria uma tabela em que cada produto pode pertencer a várias categorias armazenadas como uma matriz 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']);Verificando associação com ANY
O operador ANY permite testar se um valor aparece em qualquer posição de uma matriz. A sintaxe é: value = ANY(array_column).
Essa consulta encontra todos os produtos marcados com eletrônicos.
SELECT name, tags
FROM products
WHERE 'electronics' = ANY(tags);ANY não serve apenas para texto
ANY funciona com qualquer tipo de dado que ofereça suporte à igualdade. Aqui temos uma tabela de pontuações armazenadas como matrizes de inteiros. A consulta recupera os estudantes que obtiveram a pontuação máxima de 100 em pelo menos um teste.
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);Excluindo linhas com NOT + ANY
Para encontrar linhas em que um valor não aparece em uma matriz, combine NOT com ANY. Observe que value <> ANY(arr) tem um significado diferente — retorna verdadeiro se qualquer elemento for diferente, o que quase sempre é verdade.
Use NOT (value = ANY(arr)) para uma verificação de exclusão confiável.
-- Find products that are NOT tagged as 'sale'
SELECT name, tags
FROM products
WHERE NOT ('sale' = ANY(tags));O operador de contém @>
O operador @> verifica se uma matriz contém todos os elementos de outra. Pense nele assim: a matriz da esquerda inclui todos os elementos listados à direita?
Isso encontra produtos que têm tanto a etiqueta eletrônicos quanto a etiqueta promoção.
SELECT name, tags
FROM products
WHERE tags @> ARRAY['electronics', 'sale'];O operador de estar contido <@
O operador <@ é o inverso de @>. Ele verifica se a matriz da esquerda está totalmente contida na matriz da direita.
Essa consulta encontra produtos cuja lista completa de etiquetas é um subconjunto do conjunto eletrônicos, computadores, promoção.
SELECT name, tags
FROM products
WHERE tags <@ ARRAY['electronics', 'computers', 'sale'];O operador de sobreposição &&
O operador && retorna verdadeiro quando duas matrizes compartilham pelo menos um elemento em comum. Ele equivale, para matrizes, a perguntar: essas duas listas têm algo em comum?
A consulta abaixo encontra produtos que compartilham pelo menos uma etiqueta com uma determinada lista de compras.
SELECT name, tags
FROM products
WHERE tags && ARRAY['audio', 'summer', 'gifts'];Sobreposição versus contém — diferença principal
É fácil confundir @> com &&. Veja uma comparação clara:
tags @> ARRAY['a','b']— a linha precisa ter ambos, 'a' e 'b'.tags && ARRAY['a','b']— a linha precisa de pelo menos um entre 'a' e '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'];Usando array_length para filtrar por tamanho
Às vezes, você quer encontrar linhas em que a matriz tem uma determinada quantidade de elementos. array_length(arr, 1) retorna o número de elementos na primeira dimensão.
Essa consulta encontra produtos com exatamente três etiquetas.
SELECT name, tags
FROM products
WHERE array_length(tags, 1) = 3;Combinando pesquisas em matrizes com outras condições
Os operadores de matrizes funcionam junto com condições SQL comuns. Você pode combiná-los com AND, OR e quaisquer outros predicados de cláusulas WHERE para criar 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;Indexando matrizes para obter mais velocidade
Em tabelas grandes, as pesquisas em matrizes podem ser lentas sem um índice. O índice GIN (índice invertido generalizado) do PostgreSQL foi projetado para colunas de matriz e oferece suporte eficiente aos operadores @>, <@ e &&.
ANY não usa diretamente um índice GIN, mas os operadores de sobreposição e contém usam.
-- 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'];Verificação rápida: operadores de matrizes
Teste sua compreensão sobre os operadores de pesquisa em matrizes do PostgreSQL.
Resumo da lição
Nesta lição, você aprendeu três formas fundamentais de pesquisar dentro de matrizes do PostgreSQL:
- = ANY(arr) — verifica se um único valor existe em qualquer posição da matriz.
- @> (contém) — verifica se a matriz inclui todos os elementos especificados.
- && (sobreposição) — verifica se a matriz compartilha pelo menos um elemento com outra matriz.
Você também viu <@ para a verificação de contenção inversa, array_length para filtragem por tamanho e o índice GIN para tornar rápidas as pesquisas em matrizes em grandes conjuntos de dados. Combinar esses operadores com condições WHERE padrão oferece um controle preciso e expressivo sobre dados com vários valores.
Perguntas Frequentes
A aula “Pesquisando dentro de matrizes” é grátis?
Sim — o texto completo de “Pesquisando dentro de matrizes” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Pesquisando dentro de matrizes”?
Operadores ANY, de contém e de sobreposição. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Pesquisando dentro de matrizes”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Noções básicas de colunas de matriz
- Pesquisando dentro de matrizes
- UNNEST e agregação
- Matrizes versus tabelas normalizadas