Cadena de orden SQL como número


Tengo números guardados como VARCHAR en una base de datos MySQL. No puedo hacerlos INT debido a algunas otras circunstancias dependientes.

Es tomarlos como carácter no como número mientras se ordena.

En la base de datos tengo

1 2 3 4 5 6 7 8 9 10...

En mi página muestra una lista ordenada como esta:

1 10 2 3 4 5 6 7 8 9

¿Cómo puedo hacer que aparezca ordenado por números ascendentes?

Author: juergen d, 2012-08-04

10 answers

Si es posible, debe cambiar el tipo de datos de la columna a un número si solo almacena números de todos modos.

Si no puedes hacer eso, entonces envía el valor de tu columna a un integer explícitamente con

select col from yourtable
order by cast(col as unsigned)

O implícitamente por ejemplo con una operación matemática que fuerza una conversión a número

select col from yourtable
order by col + 0

Por cierto MySQL convierte cadenas de izquierda a derecha. Ejemplos:

string value  |  integer value after conversion
--------------+--------------------------------
'1'           |  1
'ABC'         |  0   /* the string does not contain a number, so the result is 0 */
'123miles'    |  123 
'$123'        |  0   /* the left side of the string does not start with a number */
 188
Author: juergen d,
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
2018-07-11 10:53:42

De otra manera, sin usar un solo molde.

(Para personas que usan JPA 2.0, donde no se permite el casting)

select col from yourtable
order by length(col),col

EDITAR: solo funciona para enteros positivos

 49
Author: Velter,
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
2018-07-04 18:17:32

La columna con la que estoy ordenando tiene cualquier combinación de alfa y numérico, así que usé las sugerencias en este post como punto de partida y se me ocurrió esto.

DECLARE @tmp TABLE (ID VARCHAR(50));
INSERT INTO @tmp VALUES ('XYZ300');
INSERT INTO @tmp VALUES ('XYZ1002');
INSERT INTO @tmp VALUES ('106');
INSERT INTO @tmp VALUES ('206');
INSERT INTO @tmp VALUES ('1002');
INSERT INTO @tmp VALUES ('J206');
INSERT INTO @tmp VALUES ('J1002');

SELECT ID, (CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) IsNum
FROM @tmp
ORDER BY IsNum, LEN(ID), ID;

Resultados

ID
------------------------
106
206
1002
J206
J1002
XYZ300
XYZ1002

Espero que esto ayude

 13
Author: Losbear,
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
2015-10-15 02:41:37

Otra manera simple

ORDER BY ABS(column_name)

 6
Author: Parth Solanki,
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
2017-03-10 07:36:13

Otra forma de convertir.

Si tiene un campo de cadena, puede transformarlo o su parte numérica de la siguiente manera: agregue ceros a la izquierda para que todas las cadenas de enteros tengan la misma longitud.

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( stringfield ) ) , stringfield ) 

U ordenar por parte de un campo algo como 'tensymbols13', 'tensymbols1222' etc.

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) ) 
 4
Author: shukshin.ivan,
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
2014-05-19 13:48:57

Esto manejará números negativos, fracciones, cadena, todo -

ORDER BY ISNUMERIC(col) DESC, Try_Parse(col AS decimal(10,2)), col;

 2
Author: Amir,
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
2018-03-30 23:43:50

Estaba buscando también una clasificación de campos que tiene prefijo de letra. Esto es lo que encontré la solución. Esto podría ayudar a quién está buscando la misma solución.

Valores de campo:

FL01,FL02,FL03,FL04,FL05,...FL100,...FL123456789

select SUBSTRING(field,3,9) as field from table order by SUBSTRING(field,3,10)*1 desc

SUBSTRING(field,3,9) puse 9 porque 9 es suficiente para mí para mantener valores enteros de máximo 9 dígitos.

Así que el resultado será 123456789 123456788 123456787 ... 100 99 ... 2 1

 1
Author: user2400083,
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-06-24 06:49:08

Esto funciona para mí.

select * from tablename
order by cast(columnname as int) asc
 1
Author: Patrick De Guzman,
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
2018-05-17 09:22:40

Para MySQL puede usar esto:

SELECT your_column 
FROM your_table
ORDER BY LENGTH(your_column) ASC, your_column ASC
 0
Author: Jaci,
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
2018-08-21 17:17:25

Altera tu campo para que sea INT en lugar de VARCHAR.

No puedo hacerlos INT debido a otras circunstancias dependiendo.

Luego arregla primero las circunstancias dependientes. De lo contrario, está trabajando en torno al problema subyacente real. Usar un CAST de MySQL es una opción, pero está enmascarando tu esquema defectuoso, lo que debería arreglarse.

 -3
Author: Glen,
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
2015-11-18 11:34:35