Imagínate que quieres sumar dos números, pero uno de los parámetros está guardado como string. O, por ejemplo, quieres filtrar datos por año, pero la fecha la tienes guardada en formato completo con la hora. A PostgreSQL esto no le va a gustar mucho, así que tendrás que intervenir para convertir los datos al tipo correcto.
La conversión de tipos ayuda a:
- Simplificar el manejo de datos para poder usarlos en cálculos.
- Crear datos más legibles y estructurados para exportar o analizar.
- Evitar errores relacionados con incompatibilidad de tipos de datos.
Bases de la conversión de tipos de datos: CAST() y ::
1. CAST() — el hermano mayor de cualquier conversión
La función CAST() es la forma "oficial" de convertir valores de un tipo de dato a otro. Funciona como un traductor universal.
Sintaxis:
CAST(valor AS tipo_de_dato_objetivo)
Ejemplo 1: Convertir string a número.
SELECT CAST('123' AS INTEGER); -- Resultado: 123
Ejemplo 2: Convertir número a string.
SELECT CAST(123 AS TEXT); -- Resultado: '123'
Ejemplo 3: Convertir fecha a string.
SELECT CAST(NOW() AS TEXT); -- Resultado: '2023-10-25 15:00:00.000000'
2. Operador :: — alternativa corta
Si CAST() te parece un poco largo, PostgreSQL te ofrece la sintaxis ::. Es una forma abreviada de convertir, muy popular por su brevedad.
Sintaxis:
valor::tipo_de_dato_objetivo
Ejemplo 1: Convertir string a número.
SELECT '123'::INTEGER; -- Resultado: 123
Ejemplo 2: Convertir número a string.
SELECT 123::TEXT; -- Resultado: '123'
Ejemplo 3: Convertir fecha a string.
SELECT NOW()::TEXT; -- Resultado: '2023-10-25 15:00:00.000000'
Ejemplos reales de uso de conversión de tipos
1. Conversión de números y strings
Supón que tienes una tabla students, donde la columna student_id se guarda como string, pero quieres compararla con un valor numérico. Sin conversión, no va a funcionar.
| 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 |
Por eso, en la consulta tienes que convertir explícitamente la columna student_id a número:
SELECT *
FROM students
WHERE student_id::INTEGER = 101;
Consulta equivalente usando CAST():
SELECT *
FROM students
WHERE CAST(student_id AS INTEGER) = 101;
Conversión de fechas
Cuando necesitas extraer parte de una fecha o convertirla a string, la conversión de tipos también te salva. Por ejemplo, tienes una tabla courses con fechas de inicio de cursos en la columna start_date.
| course_id | course_name | start_date |
|---|---|---|
| 1 | Introducción a Python | 2025-01-15 |
| 2 | Fundamentos de SQL | 2025-03-01 |
| 3 | Análisis de datos | 2025-05-10 |
| 4 | Desarrollo web | 2025-06-20 |
| 5 | Machine learning | 2025-09-05 |
Ejemplo: Extraer el año como número.
SELECT start_date::DATE, start_date::TEXT, start_date::TIMESTAMP
FROM courses;
El resultado será así:
| 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 |
Ejemplo: Convertir la fecha a "string limpio".
SELECT TO_CHAR(start_date, 'DD-MM-YYYY')
El resultado será así:
| to_char |
|---|
| 15-01-2025 |
| 01-03-2025 |
| 10-05-2025 |
| 20-06-2025 |
| 05-09-2025 |
Error: ¿Cuándo falla la conversión?
El truco de convertir datos no siempre funciona. A veces PostgreSQL te deja claro que "no entiende" lo que quieres hacer. Aquí tienes un ejemplo clásico: intentas convertir un texto que parece un número, pero el texto tiene caracteres de más.
Ejemplo de error:
SELECT '123abc'::INTEGER;
-- ERROR: sintaxis de entrada no válida para tipo integer: "123abc"
Para evitar estos problemas, asegúrate de que los datos realmente se pueden convertir al tipo objetivo antes. Por ejemplo, puedes usar expresiones regulares o comprobaciones extra.
GO TO FULL VERSION