Skip to content
Empieza gratis

¿Cómo limpio texto, números y huecos en SQL? TRIM, CASE, TRY_CAST y COALESCE

Repite en DuckDB la limpieza de ciudad, monto y descuento, y descubre que SQL también deja huecos sin avisar.

Curso gratis. Tu Maestro, una IA, .

Muchas veces los datos no llegan en un archivo, sino en una base de datos, y la limpieza se hace en SQL antes de que nadie abra pandas. La buena noticia: el método es el mismo. Mirar, decidir, arreglar en código, contar y anotar. Solo cambian las palabras.

En este módulo trabajas con DuckDB, una base de datos que corre aquí mismo, sobre la misma hoja de ventas de marzo: una tabla ventas con las mismas 60 filas. Este curso da por hecho que ya sabes escribir un SELECT con WHERE y GROUP BY; lo nuevo son las funciones que limpian. Así se traduce lo que hiciste en pandas:

En pandasEn SQL (DuckDB)Para qué
str.strip()TRIM(ciudad)Quitar espacios al principio y al final
str.lower()LOWER(ciudad)Bajar a minúsculas
map(CIUDADES)CASE ... WHEN ... THEN ... ENDMandar cada forma a su nombre oficial
str.replace("$", "")REPLACE(monto, '$', '')Quitar caracteres
pd.to_numeric(..., errors="coerce")TRY_CAST(... AS DECIMAL(10, 2))Convertir sin detenerse
fillna(0)COALESCE(descuento, 0)Llenar un hueco con un valor

Abre los pasos uno por uno. Cada consulta la corrimos sobre la tabla del curso.

La hoja de marzo, limpia en una consulta

Ejemplo resuelto · 5 pasos

Quieres una consulta que devuelva cada venta con la ciudad oficial, el monto como número y el descuento sin huecos, sin cambiar la tabla original.

Piensa el siguiente paso por tu cuenta y luego ábrelo para comparar.

Dos parecidos con pandas no son casualidad. El CASE sin ELSE se porta como map(): lo que no conoce lo vuelve NULL. Y TRY_CAST se porta como errors="coerce": lo que no puede convertir lo vuelve NULL y sigue sin decir nada. En los dos lenguajes, la limpieza que no se detiene es cómoda y te obliga a contar.

Una diferencia práctica: en SQL no modificas la tabla, escribes una consulta que la lee y devuelve la versión limpia. Es la misma idea que en pandas, donde el archivo crudo no se toca y el código produce el limpio.

¿En tu trabajo limpias en la base de datos o después, en Excel o pandas? Platícale a tu Maestro cómo es el camino de tus datos.

Inténtalo

La consulta de abajo cuenta ventas por ciudad oficial, pero a su CASE le faltan dos formas. Córrela tal como está y mira el último renglón. Si no sabes qué formas faltan, pídele a tu Maestro una pista.

Corre la consulta y mira el renglón con la ciudad vacía. Encuentra qué formas de escribir la ciudad no están en el CASE (puedes agregar una consulta que cuente LOWER(TRIM(ciudad))) y agrégalas con su nombre oficial. Terminaste cuando el resultado tiene exactamente 4 ciudades, nin

Tu turno

Corre la consulta y mira el renglón con la ciudad vacía. Encuentra qué formas de escribir la ciudad no están en el CASE (puedes agregar una consulta que cuente LOWER(TRIM(ciudad))) y agrégalas con su nombre oficial. Terminaste cuando el resultado tiene exactamente 4 ciudades, ningún renglón vacío, y suma 60 ventas.

Tablas: ventas (captura, folio, fecha, cliente, ciudad, producto, kilos, monto, descuento)

ventas · 60 filas

ColumnaTipo
captura Orden en que se capturó el renglón en la hoja (1 es el primero).BIGINT
folio Folio de la venta.VARCHAR
fecha Fecha de la venta, AAAA-MM-DD.VARCHAR
clienteVARCHAR
ciudad Ciudad del cliente, como se capturó.VARCHAR
productoVARCHAR
kilos Kilos vendidos, como se capturaron.DOUBLE
monto Monto de la venta en pesos, como texto tal como se capturó.VARCHAR
descuento Descuento en porcentaje; vacío cuando no hubo descuento.DOUBLE

Primeras filas

capturafoliofechaclienteciudadproductokilosmontodescuento
1V-00012026-03-01Abarrotes Doña MaryGuadalajaraCafé tostado28$7,784.0010
2V-00022026-03-01Grano FinoCiudad de MéxicoCafé verde464,69210
3V-00032026-03-02Hotel MiradorpueblaCafé tostado4514,130NULL

Cada ejecución empieza con copias nuevas de las tablas del curso, así que puedes probar lo que quieras.

Listo para ejecutar tu consulta.

Ejecútalo tú

Con el CASE incompleto salen Ciudad de México 28, Guadalajara 8, Oaxaca de Juárez 9, Puebla 13 y un renglón vacío con 2 ventas: la "gdl" y la "oaxaca". Completo, quedan 4 ciudades: Ciudad de México 28, Guadalajara 9, Oaxaca de Juárez 10 y Puebla 13. El renglón vacío es tu conteo de huecos: en SQL aparece solo, porque GROUP BY junta los NULL en un grupo propio.

Ahora el monto. Encuentra las ventas cuyo monto está vacío o no se pudo convertir, como hiciste en pandas. Si TRY_CAST te devuelve más renglones de los que esperas, pregúntale a tu Maestro qué carácter falta quitar.

Escribe una consulta que devuelva folio y monto de las ventas donde el monto, ya sin signo de pesos ni comas y convertido con TRYCAST(... AS DECIMAL(10, 2)), queda NULL. Ordena por folio. Terminaste cuando te salen exactamente las dos ventas que ya conoces del módulo 2.

Tu turno

Escribe una consulta que devuelva folio y monto de las ventas donde el monto, ya sin signo de pesos ni comas y convertido con TRY_CAST(... AS DECIMAL(10, 2)), queda NULL. Ordena por folio. Terminaste cuando te salen exactamente las dos ventas que ya conoces del módulo 2.

Tablas: ventas (captura, folio, fecha, cliente, ciudad, producto, kilos, monto, descuento)

ventas · 60 filas

ColumnaTipo
captura Orden en que se capturó el renglón en la hoja (1 es el primero).BIGINT
folio Folio de la venta.VARCHAR
fecha Fecha de la venta, AAAA-MM-DD.VARCHAR
clienteVARCHAR
ciudad Ciudad del cliente, como se capturó.VARCHAR
productoVARCHAR
kilos Kilos vendidos, como se capturaron.DOUBLE
monto Monto de la venta en pesos, como texto tal como se capturó.VARCHAR
descuento Descuento en porcentaje; vacío cuando no hubo descuento.DOUBLE

Primeras filas

capturafoliofechaclienteciudadproductokilosmontodescuento
1V-00012026-03-01Abarrotes Doña MaryGuadalajaraCafé tostado28$7,784.0010
2V-00022026-03-01Grano FinoCiudad de MéxicoCafé verde464,69210
3V-00032026-03-02Hotel MiradorpueblaCafé tostado4514,130NULL

Cada ejecución empieza con copias nuevas de las tablas del curso, así que puedes probar lo que quieras.

Listo para ejecutar tu consulta.

Ejecútalo tú

Salen V-0036, con el monto vacío, y V-0050, con "pendiente": las mismas dos que encontraste en pandas. Si te salieron muchas más, probablemente convertiste sin quitar el signo de pesos o las comas: TRY_CAST no se detiene, solo devuelve NULL en cada monto que trae "$" o ",", y en esta hoja eso deja 47 de 60 montos en NULL. Es justo la trampa de la conversión silenciosa, ahora en SQL.

Comprueba lo que sabes: En DuckDB corres `SELECT TRY_CAST('pendiente' AS INTEGER)`. ¿Qué pasa?