Arrays são usados direto pra guardar vários valores numa coluna só — tipo tags, números, funções ou preferências. Mas como saber se um array tem o valor que a gente quer, ou se todos os elementos batem com uma condição? O PostgreSQL tem uns jeitos bem práticos pra isso: ANY, ALL e array_contains(). Bora ver cada um deles na prática.
O que é ANY?
Imagina que tu tem um array com vários valores, tipo IDs de produtos, números de telefone ou uma lista de hobbies. Muitas vezes tu precisa checar se um valor específico tá nesse array. É aí que entra o operador ANY. Ele deixa tu conferir se o "objeto procurado" tá no array.
Sintaxe do ANY
SELECT *
FROM your_table
WHERE value = ANY(array_column);
Aqui:
array_column— é o array que a gente vai checar.value— é o valor que tu tá procurando no array.
Exemplo de uso do ANY
Vamos supor que a gente tem uma tabela students com essa estrutura:
| id | name | hobbies |
|---|---|---|
| 1 | Otto | {leitura, natacao, xadrez} |
| 2 | Eva | {musica, leitura, esporte} |
| 3 | Alex | {desenho, musica} |
| 4 | Maria | {xadrez, futebol} |
A gente quer achar os estudantes que têm natacao como um dos hobbies. A query fica assim:
SELECT *
FROM students
WHERE 'natacao' = ANY(hobbies);
Resultado:
| id | name | hobbies |
|---|---|---|
| 1 | Otto | {leitura, natacao, xadrez} |
Resumindo, ANY pergunta: "Esse valor tá nesse array?".
Confia, mas confere tudo! Usando ALL
Agora imagina o contrário: tu precisa garantir que todos os elementos do array seguem uma regra. Pra isso, o PostgreSQL tem o operador ALL. Com ele, tu pode checar se todos os elementos do array, por exemplo, são iguais a um valor, são maiores que um número ou batem com qualquer outra condição lógica.
Sintaxe do ALL
SELECT *
FROM your_table
WHERE value < ALL(array_column);
Aqui:
array_column— é o array que a gente vai checar.value < ALL(...)quer dizer que todos os elementos do array têm que ser maiores que o valor.
Voltando pra nossa tabela students. Digamos que a gente quer achar estudantes que todos os hobbies começam com "leitura". A query:
SELECT *
FROM students
WHERE 'leitura' = ALL(hobbies);
O resultado vai ser vazio, porque ninguém tem todos os hobbies iguais a "leitura". Pra ficar mais claro (e funcionar), bora pensar em dados numéricos.
Imagina uma tabela orders:
| id | customer | prices |
|---|---|---|
| 1 | Otto | {100, 200, 300} |
| 2 | Eva | {50, 60, 70} |
| 3 | Alex | {500, 600, 700} |
Achar todos os pedidos onde cada item custa menos de 400:
SELECT *
FROM orders
WHERE 400 > ALL(prices);
Resultado:
| id | customer | prices |
|---|---|---|
| 1 | Otto | {100, 200, 300} |
| 2 | Eva | {50, 60, 70} |
Filtrando linhas pelo conteúdo do array
A gente já viu as funções e operadores básicos pra buscar dados em arrays, mas como isso aparece no dia a dia? Bora ver uns exemplos práticos.
Exemplo 1: Achar estudantes que têm pelo menos um hobby igual a musica
Tabela original:
| id | name | hobbies |
|---|---|---|
| 1 | Otto | {leitura, musica, corrida} |
| 2 | Eva | {desenho, natacao} |
| 3 | Maria | {musica, boxe} |
| 4 | Alex | {futebol, boxe, jogosdemesa} |
SELECT *
FROM students
WHERE 'musica' = ANY(hobbies);
Resultado:
| id | name | hobbies |
|---|---|---|
| 1 | Otto | {leitura, musica, corrida} |
| 3 | Maria | {musica, boxe} |
Exemplo 2: Achar pedidos com preços acima de 100 em todos os itens
Tabela original orders:
| id | customer | prices |
|---|---|---|
| 1 | Otto | {150, 200, 300} |
| 2 | Eva | {50, 120, 130} |
| 3 | Maria | {200, 250, 100} |
| 4 | Alex | {110, 115, 120} |
SELECT *
FROM orders
WHERE 100 < ALL(prices);
Resultado:
| id | customer | prices |
|---|---|---|
| 1 | Otto | {150, 200, 300} |
| 4 | Alex | {110, 115, 120} |
Erros comuns e como evitar
Quando tu trabalha com arrays, principalmente pra buscar dados, tem umas pegadinhas que podem te pegar de surpresa.
Erro: Uso errado do ANY ou ALL. Por exemplo, se tu confundir os operadores, pode acabar com resultados nada a ver.
-- Errado:
SELECT *
FROM students
WHERE hobbies = ANY('leitura');
Nesse exemplo, o erro é que hobbies é um array e 'leitura' é uma string. É o array que tem que ser checado com ANY, não o contrário.
Erro: Indexação de arrays começa em 1, não em 0. Se tu usa arrays em outras funções ou tenta pegar elementos manualmente, lembra desse detalhe do PostgreSQL.
Erro: Falta de indexação. Se tu usa arrays pra buscas frequentes (ANY, ALL), criar índices pode deixar as queries muito mais rápidas.
GO TO FULL VERSION