Imagina que tu quer somar dois números, mas um dos parâmetros tá salvo como string. Ou, por exemplo, tu quer filtrar dados pelo ano, mas a data tá salva no formato completo com hora. O PostgreSQL pode não curtir muito tua ideia, e aí tu vai ter que dar um jeito de converter os dados pro tipo certo.
Converter tipos ajuda a:
- Facilitar o processamento dos dados pra usar em cálculos.
- Deixar os dados mais legíveis e organizados pra exportação ou análise.
- Evitar erros por causa de tipos de dados incompatíveis.
O básico da conversão de tipos: CAST() e ::
1. CAST() — o irmão mais velho de toda conversão
A função CAST() é o jeito "oficial" de converter valores de um tipo de dado pra outro. Ela funciona tipo um tradutor universal.
Sintaxe:
CAST(valor AS tipo_de_dado_destino)
Exemplo 1: Converter string pra número.
SELECT CAST('123' AS INTEGER); -- Resultado: 123
Exemplo 2: Converter número pra string.
SELECT CAST(123 AS TEXT); -- Resultado: '123'
Exemplo 3: Converter data pra string.
SELECT CAST(NOW() AS TEXT); -- Resultado: '2023-10-25 15:00:00.000000'
2. Operador :: — alternativa curtinha
Se CAST() parece meio palavroso pra ti, o PostgreSQL tem o ::. É um jeito abreviado de converter, bem popular porque é rapidinho de escrever.
Sintaxe:
valor::tipo_de_dado_destino
Exemplo 1: Converter string pra número.
SELECT '123'::INTEGER; -- Resultado: 123
Exemplo 2: Converter número pra string.
SELECT 123::TEXT; -- Resultado: '123'
Exemplo 3: Converter data pra string.
SELECT NOW()::TEXT; -- Resultado: '2023-10-25 15:00:00.000000'
Exemplos reais de uso de conversão de tipos
1. Convertendo números e strings
Vamos supor que tu tem uma tabela students, onde a coluna student_id tá salva como string, mas tu quer comparar ela com um valor numérico. Sem converter, não vai rolar.
| student_id | first_name | last_name | birth_date | grade |
|---|---|---|---|---|
| 101 | Alex | Lin | 2008-03-15 | 9 |
| 102 | Maria | Chi | 2009-07-22 | 8 |
| 103 | Axel | Ivy | 2007-11-30 | 10 |
| 104 | Nat | Sok | 2008-01-18 | 9 |
| 105 | Pol | Frez | 2009-05-05 | 8 |
Então, na query tu tem que converter a coluna student_id pra número:
SELECT *
FROM students
WHERE student_id::INTEGER = 101;
Query parecida usando CAST():
SELECT *
FROM students
WHERE CAST(student_id AS INTEGER) = 101;
Convertendo datas
Quando tu precisa pegar só uma parte da data ou transformar ela em string, a conversão de tipos também resolve. Por exemplo, tu tem uma tabela courses com as datas de início dos cursos na coluna start_date.
| course_id | course_name | start_date |
|---|---|---|
| 1 | Introdução ao Python | 2025-01-15 |
| 2 | Fundamentos de SQL | 2025-03-01 |
| 3 | Análise de Dados | 2025-05-10 |
| 4 | Desenvolvimento Web | 2025-06-20 |
| 5 | Machine Learning | 2025-09-05 |
Exemplo: Pegar o ano como número.
SELECT start_date::DATE, start_date::TEXT, start_date::TIMESTAMP
FROM courses;
O resultado vai ser assim:
| start_date (DATE) | start_date (TEXT) | start_date (TIMESTAMP) |
|---|---|---|
| 2025-01-15 | 2025-01-15 | 2025-01-15 00:00:00 |
| 2025-03-01 | 2025-03-01 | 2025-03-01 00:00:00 |
| 2025-05-10 | 2025-05-10 | 2025-05-10 00:00:00 |
| 2025-06-20 | 2025-06-20 | 2025-06-20 00:00:00 |
| 2025-09-05 | 2025-09-05 | 2025-09-05 00:00:00 |
Exemplo: Converter data pra "string pura".
SELECT TO_CHAR(start_date, 'DD-MM-YYYY')
O resultado vai ser assim:
| to_char |
|---|
| 15-01-2025 |
| 01-03-2025 |
| 10-05-2025 |
| 20-06-2025 |
| 05-09-2025 |
Erro: Quando a conversão quebra?
O truque da conversão nem sempre funciona. Às vezes o PostgreSQL deixa bem claro que ele "não entendeu" o que tu queria. Olha esse exemplo clássico: tu tenta converter um texto que parece número, mas tem uns caracteres a mais.
Exemplo de erro:
SELECT '123abc'::INTEGER;
-- ERRO: sintaxe de entrada inválida para tipo integer: "123abc"
Pra evitar esse tipo de problema, garante antes que os dados realmente podem ser convertidos pro tipo que tu quer. Tu pode usar regex ou outras checagens extras pra isso.
GO TO FULL VERSION