English

Manual de campo · trampas de SQL

¿Por qué la transferencia más grande del mes sale como $990?

Si el monto se guardó como texto, ORDER BY lo compara letra por letra: '9' va antes que '75000' porque el primer carácter de '990' es más grande, sin que importen las cifras que vienen después.

Cuándo aparece

Columnas numéricas importadas de un CSV, una API o un formulario, que llegaron como VARCHAR y nadie las convirtió. Ordenarlas o compararlas tal cual da un orden que parece aleatorio.

Ejemplo

Mal: se ordena una columna de texto como si fuera número

SELECT cuenta, monto
FROM transferencias
ORDER BY monto DESC
LIMIT 3;
-- monto es VARCHAR: '990' > '9500' > '870' porque se compara
-- carácter a carácter, y la de 75,000 pesos no aparece

Bien: convertir a número antes de ordenar

SELECT cuenta, monto
FROM transferencias
ORDER BY CAST(monto AS BIGINT) DESC
LIMIT 3;
-- TRY_CAST en vez de CAST si alguna fila puede traer texto no numérico
-- (una coma de miles, una celda vacía): TRY_CAST da NULL en vez de reventar la consulta

Un VARCHAR se ordena como texto: compara el primer carácter, y sólo si empatan mira el segundo. '990' gana a '75000' porque '9' > '7', sin que a la comparación le importe que a '75000' le sobren cifras. CAST(monto AS BIGINT) convierte antes de ordenar, y ahí 75000 sí es mayor que 990. La diferencia entre CAST y TRY_CAST importa en datos reales: CAST revienta la consulta entera si una sola fila trae '12,000' con coma o una celda vacía; TRY_CAST convierte esa fila en NULL y deja que las demás sigan. Cuál de los dos usar depende de si quieres enterarte del dato sucio ahora o más tarde.

El juego está lleno de trampas como esta, escondidas en casos con datos de verdad.

Jugar el caso 1 gratis →

Trampas relacionadas