Caracteres DE ORDEN SQL numéricamente


Tengo una columna de números almacenados como caracteres. Cuando hago un PEDIDO POR para esta columna obtengo lo siguiente:

100
131
200
21
30
31000
sucesivamente.

¿Cómo puedo ordenar estos caracteres numéricamente? ¿Necesito convertir algo o ya hay un comando o función SQL para esto?

Gracias.

Author: Cade Roux, 2009-01-29

4 answers

Prueba esto:

ORDER BY CAST(thecolumn AS int)
 66
Author: Ray Hidayat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-28 23:26:39

Esto funcionó para mí:

ORDER BY ABS(column_name)
 22
Author: Nev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-18 20:07:05

Este es un problema con el orden de cadenas numéricas en una "ordenación natural" (si buscas "ordenación natural" en Google encontrarás toneladas de cosas). Esencialmente, lanzar la cadena como int y ordenar el valor resultante debería solucionarlo.

 2
Author: BenAlabaster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-28 23:27:59

La razón de esto es que con un tipo de datos char, está ordenando las filas como una cadena.

La idea de ORDER BY CAST() es correcta, sin embargo, el rendimiento de esto disminuirá a medida que aumente el número de resultados devueltos.

Si solo se trata de datos numéricos en esta columna, la mejor práctica sería encontrar un tipo de datos numéricos adecuado y cambiarlo.

Si realmente no puede cambiar la columna y se encuentra con problemas de rendimiento, le sugiero que tenga una columna de orden de clasificación que contiene el valor fundido a un entero (los nulos serán convertidos a un valor apropiado).

Indexe la columna orden de clasificación e idealmente, agregue un disparador a la columna CHAR para que inserciones o actualizaciones al valor char activen una actualización al valor entero.

 1
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-29 09:50:40