CodeGym /Cursos /SQL SELF /Erros comuns ao trabalhar com arrays e como evitá-los

Erros comuns ao trabalhar com arrays e como evitá-los

SQL SELF
Nível 36, Lição 4
Disponível

Hoje a gente termina nossa jornada maneira sobre arrays no PostgreSQL. O papo de hoje é sobre os erros clássicos que você pode encontrar e, o mais importante, como não cair neles. Se você já pensou "esse array tá fazendo coisa estranha de novo", essa aula é pra você. Bora entender tudo.

Erros na criação de arrays: problemas com tipos de dados dentro do array

Quando você cria arrays no PostgreSQL, tem que lembrar que todos os elementos do array precisam ser do mesmo tipo. Por exemplo:

SELECT ARRAY[1, 2, 'três'];
-- Erro: todos os elementos do array precisam ser do mesmo tipo

O PostgreSQL não deixa misturar número e string no mesmo array. Se precisar disso, faz a conversão:

SELECT ARRAY[1::TEXT, 2::TEXT, 'três'];
-- Agora o array é de strings

Erros ao usar ARRAY[] com tipos de dados diferentes

Por padrão, o PostgreSQL tenta adivinhar o tipo do array pelo que tem dentro. Se você passar dados meio confusos, pode dar ruim:

SELECT ARRAY[1, NULL];
-- Erro: o PostgreSQL não sabe como interpretar NULL

Pra resolver, fala logo qual é o tipo do array:

SELECT ARRAY[1, NULL]::INTEGER[];
-- Agora funciona de boa

Erros ao extrair dados: problemas com índices do array

Se você já programa em Python ou JavaScript, onde o índice começa do zero, vai se surpreender no PostgreSQL. Aqui, os arrays começam a indexar do 1.

SELECT ARRAY[10, 20, 30][0];
-- Erro: o índice tem que começar do 1

O jeito certo:

SELECT ARRAY[10, 20, 30][1];
-- Resultado: 10

Erros ao usar funções pra extrair

Funções tipo unnest() podem confundir, porque elas "desdobram" o array em várias linhas:

CREATE TEMP TABLE exemplo (
    id SERIAL PRIMARY KEY,
    tags TEXT[]
);

INSERT INTO exemplo (tags) VALUES (ARRAY['tag1', 'tag2']), (ARRAY['tag3']);

SELECT unnest(tags) FROM exemplo;
-- Resultado:
-- tag1
-- tag2
-- tag3

Se você quiser manter o contexto da linha (tipo o id), coloca ele junto:

SELECT id, unnest(tags) AS tag FROM exemplo;
-- Resultado:
-- id | tag
--  1 | tag1
--  1 | tag2
--  2 | tag3

Erros ao filtrar e comparar arrays

  1. Uso errado dos operadores @>, <@, &&

Esses operadores servem pra funções específicas:

  • @> checa se um array contém outro array.
  • <@ checa se um array está dentro de outro.
  • && checa se dois arrays têm interseção.

O erro rola quando você usa eles do jeito errado:

SELECT ARRAY[1, 2, 3] @> 2;
-- Erro: o operador @> é pra arrays

O jeito certo:

SELECT ARRAY[1, 2, 3] @> ARRAY[2];
-- Resultado: true
  1. Problemas de performance sem índices

Se você usa muito esses operadores de array e sente que as queries tão lentas, provavelmente esqueceu de criar índice. Olha como faz:

CREATE INDEX idx_tags ON exemplo USING GIN (tags);

Agora as queries com @> e && vão rodar bem mais rápido.

Erros ao modificar arrays

  1. Remover e adicionar valores

As funções array_remove() e array_append() não mudam o array "no lugar", elas devolvem um array novo. Se você acha que o array original vai mudar sozinho, tá errado:

UPDATE exemplo
SET tags = array_remove(tags, 'tag1');
-- Agora o array foi atualizado

Se esquecer de colocar SET tags =, o SQL roda mas o array não muda.

  1. Duplicação de dados usando array_append()

A função array_append() não checa se o elemento já existe. Isso pode gerar duplicata:

SELECT array_append(ARRAY['tag1', 'tag2'], 'tag1');
-- Resultado: {tag1, tag2, tag1}

Se quiser evitar duplicata, faz uma filtragem:

SELECT array_remove(array_append(ARRAY['tag1', 'tag2'], 'tag1'), 'tag1') || 'tag1';
-- Resultado: {tag1, tag2}

Dicas pra evitar erros

Pra não cair nesses erros aí de cima quando mexer com arrays:

  1. Confere os tipos de dados. Sempre fala qual é o tipo do array se tiver dúvida.
  2. Fica ligado nos índices. Lembra que array no PostgreSQL começa do 1.
  3. Otimiza as queries com array. Usa índice pra acelerar comparação e filtro.
  4. Testa em amostras pequenas. Se a query com array tá lenta, testa com poucos dados pra achar o gargalo.
  5. Evita duplicata. Faz checagem extra quando for adicionar elemento no array, se não pode repetir.

Arrays no PostgreSQL, igual qualquer ferramenta poderosa, merecem respeito e cuidado. Seguindo essas dicas, seus arrays nunca mais vão te tirar o sono (ou quase nunca). Boa sorte na modelagem e otimização dos bancos de dados!

2
Tarefa
SQL SELF, nível 36, lição 4
Bloqueado
Modificação e filtragem de array
Modificação e filtragem de array
1
Pesquisa/teste
Comparação e filtragem de arrays, nível 36, lição 4
Indisponível
Comparação e filtragem de arrays
Comparação e filtragem de arrays
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION