¿Para qué sirve todo esto de comparar y convertir tipos? Imagina que tienes en una tabla la cadena "42" y quieres compararla con el número 42. A simple vista — parece lo mismo. Pero para la base de datos pueden ser cosas totalmente distintas. PostgreSQL no va a adivinar automáticamente lo que querías decir. Y si no entiendes cómo compara los valores de diferentes tipos, puedes obtener un resultado raro o incluso un error.
Lo mismo pasa con las conversiones. A veces necesitas convertir texto a número para contar cuántas cosas hay. O al revés — mostrar un número bonito como cadena. O tomar una fecha y mostrarla como "01.01.2025", porque así le resulta más familiar al usuario.
O mira este otro ejemplo: tienes un valor exacto guardado en NUMERIC, pero para cálculos científicos necesitas usar FLOAT. En estos casos, no hay otra que hacer una conversión explícita.
La buena noticia es que PostgreSQL lo maneja de lujo. Te da herramientas flexibles y claras para estas tareas. Lo principal es saber cómo usarlas y no tener miedo de mirar un poco bajo el capó. Vamos a ello.
Comparación de tipos de datos
PostgreSQL intenta ser listo — si ve que se comparan, por ejemplo, INTEGER y NUMERIC, los convierte tranquilamente a un denominador común y los compara. Eso está bien, porque ambos son números.
Pero si intentas comparar una cadena con un valor booleano (TEXT y BOOLEAN), la base de datos ya no va a entender lo que quieres. Esos tipos son de naturaleza totalmente distinta, y PostgreSQL simplemente dará un error. Lo mismo pasará si intentas comparar la cadena "42" con el número 42 sin decirle explícitamente que quieres convertir esa cadena a número.
¿Cómo se ve esto en la práctica? Aquí tienes un ejemplo que dará error:
SELECT '42' = 42; -- ¡Error! Una cadena y un número no se comparan sin conversión
Y así sí que funciona bien:
SELECT '42'::INTEGER = 42; -- TRUE
Aquí le decimos claramente: “Por favor, primero convierte '42' en número”. Para eso sirve la sintaxis ::Tipo, de la que ya hablamos. A PostgreSQL le gusta que le hablen claro.
Comparación de tipos numéricos
Los tipos de datos numéricos (INTEGER, NUMERIC, REAL) suelen ser compatibles entre sí, así que puedes compararlos sin mucho lío:
SELECT 42 = 42.0; -- TRUE
SELECT 42::REAL = 42.0; -- TRUE
SELECT 42.0::NUMERIC = 42; -- TRUE
Pero ojo con los números de coma flotante (REAL). Por la precisión limitada, estos números pueden comportarse raro. Por ejemplo:
SELECT 0.1 + 0.2 = 0.3; -- FALSE
¿No es este el enigma más famoso de la programación? Aquí la comparación devuelve FALSE por cómo se almacenan los números decimales en la memoria del ordenador.
Comparación de tipos de texto
Al trabajar con tipos de texto puedes comparar CHAR, VARCHAR y TEXT, ya que PostgreSQL los convierte automáticamente a tipos compatibles:
SELECT 'Hello' = 'Hello'::TEXT; -- TRUE
SELECT 'World'::CHAR(5) = 'World'::VARCHAR; -- TRUE
Fíjate en la longitud de caracteres en CHAR(n): si la cadena es más corta que la longitud indicada, PostgreSQL la rellena con espacios.
Conversión de tipos de datos
PostgreSQL ofrece varias formas de convertir tipos de datos. Vamos a ver dos métodos principales:
Método nº1: Conversión explícita (CAST)
El operador CAST te permite definir cómo convertir un tipo en otro. Mira el ejemplo:
SELECT CAST('42' AS INTEGER); -- Convierte la cadena '42' en el número 42
Este método es especialmente útil si quieres que tu código SQL sea más legible.
Método nº2: Notación corta (::)
PostgreSQL ofrece una sintaxis alternativa para convertir tipos — usando ::. Es la misma operación, pero más corta:
SELECT '42'::INTEGER; -- Igual que CAST('42' AS INTEGER)
Conversión automática
En muchos casos, PostgreSQL convierte los datos automáticamente. Por ejemplo, usando números en campos de texto:
SELECT '42' = 42::TEXT; -- TRUE
Pero no siempre es seguro confiar en la conversión automática, porque puede sorprender a otros desarrolladores. Por ejemplo, con fechas y cadenas es mejor usar conversión explícita.
Ejemplos de conversión de diferentes tipos de datos
Conversión de números a texto
A veces necesitas convertir números a texto (por ejemplo, para crear mensajes):
SELECT 42::TEXT; -- Convierte el número 42 en la cadena '42'
SELECT 3.14::TEXT; -- Convierte el número 3.14 en la cadena '3.14'
Conversión de texto a números
Si la cadena contiene un número válido, puedes convertirla a tipo numérico:
SELECT '123'::INTEGER; -- Convierte la cadena '123' en el número 123
SELECT '3.14'::FLOAT; -- Convierte la cadena '3.14' en el número 3.14
¿Pero qué pasa si el texto no se puede convertir? Por ejemplo:
SELECT 'Hello'::INTEGER; -- Error: no se puede convertir 'Hello' en número
Para evitar estos errores, puedes usar la función TRY_CAST() (desde PostgreSQL 14) o comprobar los datos antes.
Conversión de fecha a texto y viceversa
Al convertir fechas puedes usar las funciones TO_CHAR() y TO_DATE():
SELECT TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD'); -- Convierte la fecha en cadena
SELECT TO_DATE('2023-10-25', 'YYYY-MM-DD'); -- Convierte la cadena en fecha
Conversión entre BOOLEAN y texto
El tipo de dato lógico BOOLEAN también se puede convertir a cadenas:
SELECT TRUE::TEXT; -- 'true'
SELECT FALSE::TEXT; -- 'false'
O al revés:
SELECT 'true'::BOOLEAN; -- TRUE
SELECT 'false'::BOOLEAN; -- FALSE
Ojo, que cadenas como 'yes' o 'no' no se convierten automáticamente.
Práctica: todo con ejemplos reales
Vamos a crear una tabla que muestra el uso de diferentes tipos de datos:
| 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 |
Ahora vamos a hacer operaciones de conversión:
-- Conversión de texto a número
SELECT number_as_text::INTEGER FROM data_types_demo WHERE number_as_text = '42';
-- Conversión de fecha a texto
SELECT TO_CHAR(actual_date, 'DD/MM/YYYY') FROM data_types_demo;
-- Conversión de cadena a fecha
SELECT TO_DATE(date_as_text, 'YYYY-MM-DD') FROM data_types_demo;
Errores típicos al convertir datos
Los errores más comunes incluyen:
- Intentar convertir datos que no tienen el formato esperado (por ejemplo, la cadena
'Hello'aINTEGER). - Problemas de redondeo y precisión al trabajar con números de coma flotante.
- Uso incorrecto de formatos al convertir fechas.
Para evitar errores se recomienda:
- Comprobar siempre los datos antes de convertir.
- Usar funciones de manejo de errores (
TRY_CASToCASE). - Indicar el formato explícitamente al convertir fechas.
-- Comprobar los datos antes de convertir
SELECT
CASE
WHEN number_as_text ~ '^\d+$' THEN number_as_text::INTEGER
ELSE NULL
END AS safe_integer
FROM data_types_demo;
¡Usa este enfoque para proteger tus consultas de situaciones inesperadas!
En este punto ya tienes las bases para comparar y convertir tipos de datos en PostgreSQL. Solo queda practicar, practicar y practicar. ¡Nos vemos en las siguientes lecciones!
GO TO FULL VERSION