Lecciones del módulo (4/4)
CAST y conversiones de tipo
SQL está fuertemente tipado: cada columna tiene un tipo (INTEGER, TEXT,
NUMERIC, DATE, TIMESTAMP…), y muchas operaciones requieren los tipos
para coincidir. Cuando no lo hacen, o cuando desea formatear un valor
de manera diferente: usas un cast.
Dos sintaxis equivalentes
-- SQL standard:
CAST(123 AS TEXT)
-- PostgreSQL shorthand (più comune nella pratica):
123::textLas dos formas son idénticas. La abreviatura ::type es más compacta y
encadena muy bien con otras expresiones:
SELECT ordered_at::date AS day,
(oi.quantity * oi.unit_price)::numeric(10,2) AS total,
id::text || ' - ' || email AS label
FROM …;Conversiones útiles en el conjunto de datos
TIMESTAMP → DATE ordered_at::date
NUMERIC → INTEGER price::int -- tronca!
INTEGER → NUMERIC quantity::numeric -- per evitare div. intera
INTEGER → TEXT id::text -- per concatenare con ||
TEXT → DATE '2024-03-05'::date
NUMERIC → TEXT price::text -- per LIKE su numeriCuando un yeso puede fallar
SELECT 'abc'::int; -- ERRORE: invalid input syntax for type integer
SELECT '12.5'::int; -- ERRORE: invalid input syntax for type integer
SELECT 12.5::int; -- 12 (cast numerico-numerico: arrotonda)Las conversiones desde cadena → número o cadena → fecha son las más riesgosas:
generan un error si la cadena no coincide exactamente con lo esperado
formato. En producción, sobre datos externos, es mejor validar primero
con TRIM / LOWER / expresión regular.
Emitir y ORDENAR POR
Un caso que genera errores sutiles: ordenar números almacenados como texto.
SELECT '2', '10', '1' ORDER BY 1; -- '1', '10', '2' (alfabetico!)Solución: emitir dentro de ORDER BY:
SELECT code FROM articles ORDER BY code::int;Pruébalo
Para cada pedido, muestre la identificación y el día (solo la parte de fecha deorder_at, de tipo fecha). Dos columnas. Ordenar por id.
Mostrar pista
La transmisión TIMESTAMP → DATE elimina la hora:order_at::date.
Solución disponible después de 3 intentos
Ejercicio de revisión
Para cada cliente, muestre una columna de etiqueta que concatene la identificación y el correo electrónico separados por '-' (por ejemplo, '1 - alice.rossi@example.com'). Ordenar por id.
Mostrar pista
El || El operador requiere operandos del mismo tipo: convertir id a texto es la forma más limpia.
Solución disponible después de 3 intentos