Saltar al contenido principal
eLearner.app
Módulo 6 · Lección 4 de 424/57 en el curso~10 min
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
-- SQL standard:
CAST(123 AS TEXT)

-- PostgreSQL shorthand (più comune nella pratica):
123::text

Las dos formas son idénticas. La abreviatura ::type es más compacta y encadena muy bien con otras expresiones:

SQL
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

SQL
TIMESTAMPDATE          ordered_at::date
NUMERICINTEGER       price::int           -- tronca!
INTEGERNUMERIC       quantity::numeric    -- per evitare div. intera
INTEGERTEXT          id::text             -- per concatenare con ||
TEXTDATE          '2024-03-05'::date
NUMERICTEXT          price::text          -- per LIKE su numeri

Cuando un yeso puede fallar

SQL
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.

SQL
SELECT '2', '10', '1' ORDER BY 1;  -- '1', '10', '2'   (alfabetico!)

Solución: emitir dentro de ORDER BY:

SQL
SELECT code FROM articles ORDER BY code::int;

Pruébalo

Ejercicio#sql.m6.l4.e1
Intentos: 0Cargando...

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.

Cargando editor...
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

Ejercicio#sql.m6.l4.e2
Intentos: 0Cargando...

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.

Cargando editor...
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