Hoje a gente vai ver como tirar o máximo dos arrays nas queries: juntar valores em grupos, filtrar pelo conteúdo e até ordenar direto dentro dos arrays. Não é teoria só por teoria — essas paradas aparecem em relatórios, análise, personalização e vários cenários do mundo real. É simples, se tu pegar o jeito — e é isso que vamos fazer agora.
Agregando dados com arrays
Trabalhar com arrays brilha mesmo quando tu precisa agrupar dados. Em vez de pegar várias linhas — a gente junta os valores num array bonitinho. Isso facilita a análise, deixa o resultado mais compacto e muitas vezes evita subqueries desnecessárias. Bora ver como isso funciona na prática.
Exemplo 1: agrupando dados em arrays com array_agg()
Quando tu quer juntar valores de várias linhas de um grupo num array, o array_agg() salva demais. É provavelmente a função mais útil pra lidar com arrays na agregação.
-- Temos uma tabela students com os campos id, name e course
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
course VARCHAR(100)
);
-- Inserindo algumas linhas
INSERT INTO students (name, course) VALUES
('Alice', 'Matemática'),
('Bob', 'Matemática'),
('Charlie', 'Física'),
('Dave', 'Física'),
('Emma', 'Matemática');
-- Agrupando estudantes por curso em arrays
SELECT course, array_agg(name) AS students
FROM students
GROUP BY course;
Resultado:
| course | students |
|---|---|
| Matemática | {Alice, Bob, Emma} |
| Física | {Charlie, Dave} |
Agrupar valores em arrays é massa se tu quer passar os dados num formato fácil de processar, tipo JSON.
Exemplo 2: criando arrays aninhados
E se a gente tiver outra tabela e quiser juntar dados de duas tabelas em arrays? Por exemplo, uma tabela courses com info dos professores.
-- Criando tabela de professores
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
teacher VARCHAR(100)
);
-- Inserindo dados
INSERT INTO courses (name, teacher) VALUES
('Matemática', 'Prof. Min'),
('Física', 'Prof. Peterson');
-- Query aninhada pra criar arrays
SELECT
c.name AS course_name,
array_agg(s.name) AS students,
c.teacher
FROM
courses c
LEFT JOIN
students s
ON
c.name = s.course
GROUP BY
c.name, c.teacher;
Resultado:
| course_name | students | teacher |
|---|---|---|
| Matemática | {Alice, Bob, Emma} | Prof. Min |
| Física | {Charlie, Dave} | Prof. Peterson |
Agora temos uma tabela massa mostrando cursos, professores e estudantes em formato de array.
Filtrando dados com arrays
Arrays já são poderosos, mas a mágica acontece mesmo quando a gente aprende a filtrar usando eles. Quer pegar só usuários que têm uma palavra específica na lista de interesses? Ou pedidos onde cada preço passa de um certo valor? Dá pra fazer tudo isso direto no SQL — sem precisar de lógica extra na aplicação.
Exemplo 1: filtrando linhas por elementos do array
Digamos que tu quer achar todas as linhas onde o array tem um valor específico, tipo buscar estudantes matriculados em matemática.
-- Filtrando estudantes matriculados em cursos usando `ANY`
SELECT *
FROM students
WHERE course = ANY(ARRAY['Matemática', 'Física']);
Aqui o ANY deixa tu passar um array de valores, e a query retorna as linhas onde course bate com pelo menos um valor do array.
Exemplo 2: Checando interseção de arrays
Agora imagina que temos uma tabela student_interests, onde os interesses dos estudantes são arrays. Queremos achar estudantes cujos interesses batem com nossos critérios.
-- Criando tabela com interesses dos estudantes
CREATE TABLE student_interests (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
interests TEXT[]
);
-- Inserindo dados
INSERT INTO student_interests (name, interests) VALUES
('Alice', ARRAY['programação', 'música']),
('Bob', ARRAY['esporte', 'programação']),
('Charlie', ARRAY['leitura', 'fotografia']),
('Emma', ARRAY['música', 'esporte']);
-- Buscando estudantes interessados em programação ou música
SELECT *
FROM student_interests
WHERE interests && ARRAY['programação', 'música'];
O operador && checa a interseção de dois arrays. Se pelo menos um elemento do array da esquerda bate com o da direita, a linha passa no filtro.
Resultado:
| id | name | interests |
|---|---|---|
| 1 | Alice | {programação, música} |
| 2 | Bob | {esporte, programação} |
| 4 | Emma | {música, esporte} |
Ordenando arrays
Às vezes a ordem dos valores no array importa — principalmente se tu junta o array de várias linhas ou quer preparar os dados pra mostrar. O PostgreSQL deixa ordenar os elementos direto na query, sem precisar tratar depois.
Exemplo 1: ordenando valores dentro do array
Às vezes tu quer ordenar os elementos do array. Por exemplo, vamos ordenar o array de interesses dos estudantes em ordem alfabética.
-- Ordenando elementos do array com `array_sort()`
SELECT
name,
array_sort(interests) AS sorted_interests
FROM
student_interests;
Resultado:
| name | sorted_interests |
|---|---|
| Alice | {música, programação} |
| Bob | {programação, esporte} |
| Charlie | {leitura, fotografia} |
| Emma | {esporte, música} |
Exemplo 2: ordenando linhas pelo tamanho do array
Agora imagina que queremos ordenar os estudantes pelo número de interesses — dos mais "nerds" pros mais "paradões".
-- Ordenando linhas pelo tamanho do array
SELECT
name,
interests,
array_length(interests, 1) AS interests_count
FROM
student_interests
ORDER BY
interests_count DESC;
Resultado:
| name | interests | interests_count |
|---|---|---|
| Alice | {programação, música} | 2 |
| Bob | {esporte, programação} | 2 |
| Charlie | {leitura, fotografia} | 2 |
| Emma | {música, esporte} | 2 |
Aqui todos os estudantes têm o mesmo número de interesses, mas dá pra adaptar a query pra tabelas maiores.
GO TO FULL VERSION