CodeGym /Cursos /SQL SELF /Comparação e conversão de tipos de dados

Comparação e conversão de tipos de dados

SQL SELF
Nível 16, Lição 3
Disponível

Por que a gente precisa disso tudo — comparação e conversão de tipos? Imagina que na sua tabela tem uma string "42", mas você quer comparar ela com o número 42. Parece igual, né? Mas pro banco de dados pode ser coisa totalmente diferente. O PostgreSQL não vai adivinhar o que você quis dizer. E se você não entender como ele compara valores de tipos diferentes, pode acabar com um resultado estranho ou até erro.

O mesmo vale pra conversão. Às vezes você precisa transformar texto em número pra contar quantos itens tem de alguma coisa. Ou, ao contrário — mostrar um número bonitinho como string. Ou pegar uma data e exibir ela tipo "01.01.2025", porque assim o usuário entende melhor.

Outro exemplo: você tem um valor exato guardado em NUMERIC, mas pra cálculos científicos precisa usar FLOAT. Nessas horas, não tem jeito — tem que converter mesmo.

A boa notícia é que o PostgreSQL manda muito bem nisso. Ele te dá ferramentas flexíveis e fáceis de usar pra essas tarefas. O segredo é saber como usar e não ter medo de olhar um pouco “por baixo do capô”. Bora ver como funciona.

Comparação de tipos de dados

O PostgreSQL tenta ser esperto — se ele vê que você tá comparando, por exemplo, INTEGER e NUMERIC, ele converte tudo pro mesmo tipo e compara de boa. Isso é tranquilo, porque os dois são números.

Mas se você tentar comparar uma string com um valor booleano (TEXT e BOOLEAN), aí o banco já não entende o que você quer. Esses tipos são bem diferentes, e o PostgreSQL vai dar erro. O mesmo acontece se você tentar comparar a string "42" com o número 42 sem dizer claramente que quer transformar a string em número.

Como isso fica na prática? Olha um exemplo que vai dar erro:

SELECT '42' = 42; -- Erro! String e número não são comparados sem conversão

Agora assim funciona direitinho:

SELECT '42'::INTEGER = 42; -- TRUE

Aqui a gente fala claramente: “Por favor, transforma '42' em número primeiro”. Pra isso serve a sintaxe ::Tipo, que já comentamos. O PostgreSQL gosta quando você fala com ele de forma direta.

Comparando tipos numéricos

Os tipos numéricos (INTEGER, NUMERIC, REAL) geralmente são compatíveis entre si, então dá pra comparar sem muita dor de cabeça:

SELECT 42 = 42.0; -- TRUE
SELECT 42::REAL = 42.0; -- TRUE
SELECT 42.0::NUMERIC = 42; -- TRUE

Mas fica ligado com números de ponto flutuante (REAL). Por causa da precisão limitada, eles podem se comportar de um jeito estranho. Por exemplo:

SELECT 0.1 + 0.2 = 0.3; -- FALSE

Essa é clássica do mundo da programação, né? Aqui a comparação retorna FALSE por causa de como os números fracionários são guardados na memória do computador.

Comparando tipos de texto

Quando você trabalha com tipos de texto, pode comparar CHAR, VARCHAR e TEXT, porque o PostgreSQL converte eles automaticamente pra tipos compatíveis:

SELECT 'Hello' = 'Hello'::TEXT; -- TRUE
SELECT 'World'::CHAR(5) = 'World'::VARCHAR; -- TRUE

Repara no tamanho dos caracteres em CHAR(n): se a string for menor que o tamanho, o PostgreSQL completa com espaços.

Conversão de tipos de dados

O PostgreSQL tem vários jeitos de converter tipos de dados. Vamos ver dois principais:

Jeito #1: Conversão explícita (CAST)

O operador CAST deixa você dizer como transformar um tipo em outro. Exemplo:

SELECT CAST('42' AS INTEGER); -- Converte a string '42' pro número 42

Esse jeito é bom se você quer deixar o SQL mais fácil de ler.

Jeito #2: Notação curta (::)

O PostgreSQL também tem uma sintaxe alternativa pra conversão — usando ::. É a mesma coisa, só que mais curto:

SELECT '42'::INTEGER; -- Igual ao CAST('42' AS INTEGER)

Conversão automática

Em muitos casos o PostgreSQL converte os dados sozinho. Por exemplo, usando números em campos de texto:

SELECT '42' = 42::TEXT; -- TRUE

Mas não confia sempre na conversão automática, porque pode confundir outros devs. Por exemplo, com datas e strings é melhor converter de forma explícita.

Exemplos de conversão de tipos diferentes

Convertendo números pra texto

Às vezes você precisa transformar números em texto (tipo pra montar mensagens):

SELECT 42::TEXT; -- Converte o número 42 pra string '42'
SELECT 3.14::TEXT; -- Converte o número 3.14 pra string '3.14'

Convertendo texto pra número

Se a string tem um número válido, você pode converter ela pra tipo numérico:

SELECT '123'::INTEGER; -- Converte a string '123' pro número 123
SELECT '3.14'::FLOAT;  -- Converte a string '3.14' pro número 3.14

Mas o que acontece se o texto não pode ser convertido? Tipo assim:

SELECT 'Hello'::INTEGER; -- Erro: não dá pra converter 'Hello' pra número

Pra evitar esses erros, você pode usar a função TRY_CAST() (a partir do PostgreSQL 14) ou checar os dados antes.

Convertendo data pra texto e vice-versa

Pra converter datas, você pode usar as funções TO_CHAR() e TO_DATE():

SELECT TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD'); -- Converte a data pra string
SELECT TO_DATE('2023-10-25', 'YYYY-MM-DD'); -- Converte a string pra data

Conversão entre BOOLEAN e texto

O tipo lógico BOOLEAN também pode ser convertido pra string:

SELECT TRUE::TEXT; -- 'true'
SELECT FALSE::TEXT; -- 'false'

Ou o contrário:

SELECT 'true'::BOOLEAN; -- TRUE
SELECT 'false'::BOOLEAN; -- FALSE

Repara que strings tipo 'yes' ou 'no' não vão ser convertidas automaticamente.

Prática: tudo com exemplos reais

Vamos criar uma tabela pra mostrar o uso de tipos diferentes:

id number_as_text - TEXT number_as_integer - INTEGER date_as_text - TEXT actual_date - DATE
1 42 42 2023-10-25 2023-10-25
2 3.14 NULL 2023-10-24 NULL
3 Hello 123 NULL NULL

Agora vamos fazer umas conversões:

-- Convertendo texto pra número
SELECT number_as_text::INTEGER FROM data_types_demo WHERE number_as_text = '42';

-- Convertendo data pra texto
SELECT TO_CHAR(actual_date, 'DD/MM/YYYY') FROM data_types_demo;

-- Convertendo string pra data
SELECT TO_DATE(date_as_text, 'YYYY-MM-DD') FROM data_types_demo;

Erros comuns ao converter dados

Os erros mais comuns são:

  1. Tentar converter dados que não estão no formato esperado (tipo string 'Hello' pra INTEGER).
  2. Problemas de arredondamento e precisão com números de ponto flutuante.
  3. Usar formatos errados ao converter datas.

Pra evitar erros, é bom:

  • Sempre checar os dados antes de converter.
  • Usar funções de tratamento de erro (TRY_CAST ou CASE).
  • Indicar o formato certinho ao converter datas.
-- Checando dados antes de converter
SELECT 
    CASE 
        WHEN number_as_text ~ '^\d+$' THEN number_as_text::INTEGER
        ELSE NULL
    END AS safe_integer
FROM data_types_demo;

Usa esse jeito pra proteger suas queries de situações inesperadas!

Nesse ponto, você já tem as skills básicas pra comparar e converter tipos de dados no PostgreSQL. Agora é só praticar, praticar e praticar mais um pouco. Te vejo nas próximas aulas!

2
Tarefa
SQL SELF, nível 16, lição 3
Bloqueado
Conversão de valor em string para número
Conversão de valor em string para número
2
Tarefa
SQL SELF, nível 16, lição 3
Bloqueado
Conversão de datas
Conversão de datas
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION