¿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 pandas | En 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 ... END | Mandar 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
| Columna | Tipo |
|---|---|
| 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 |
| cliente | VARCHAR |
| ciudad Ciudad del cliente, como se capturó. | VARCHAR |
| producto | VARCHAR |
| 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
| captura | folio | fecha | cliente | ciudad | producto | kilos | monto | descuento |
|---|---|---|---|---|---|---|---|---|
| 1 | V-0001 | 2026-03-01 | Abarrotes Doña Mary | Guadalajara | Café tostado | 28 | $7,784.00 | 10 |
| 2 | V-0002 | 2026-03-01 | Grano Fino | Ciudad de México | Café verde | 46 | 4,692 | 10 |
| 3 | V-0003 | 2026-03-02 | Hotel Mirador | puebla | Café tostado | 45 | 14,130 | NULL |
Cada ejecución empieza con copias nuevas de las tablas del curso, así que puedes probar lo que quieras. Tab agrega sangría; para salir del editor, presiona Escape y luego Tab.
Listo para ejecutar tu consulta.
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
| Columna | Tipo |
|---|---|
| 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 |
| cliente | VARCHAR |
| ciudad Ciudad del cliente, como se capturó. | VARCHAR |
| producto | VARCHAR |
| 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
| captura | folio | fecha | cliente | ciudad | producto | kilos | monto | descuento |
|---|---|---|---|---|---|---|---|---|
| 1 | V-0001 | 2026-03-01 | Abarrotes Doña Mary | Guadalajara | Café tostado | 28 | $7,784.00 | 10 |
| 2 | V-0002 | 2026-03-01 | Grano Fino | Ciudad de México | Café verde | 46 | 4,692 | 10 |
| 3 | V-0003 | 2026-03-02 | Hotel Mirador | puebla | Café tostado | 45 | 14,130 | NULL |
Cada ejecución empieza con copias nuevas de las tablas del curso, así que puedes probar lo que quieras. Tab agrega sangría; para salir del editor, presiona Escape y luego Tab.
Listo para ejecutar tu consulta.
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.