Tengo números guardados VARCHAR
en una base de datos MySQL. No puedo hacerlos INT
debido a otras circunstancias dependientes.
Los toma como caracteres, no como números mientras los 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 parezca ordenado por números ascendentes?
Respuestas:
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 puede hacer eso, envíe el valor de su columna a un
integer
explícitamente cono implícitamente, por ejemplo, con una operación matemática que obliga a una conversión a número
Por cierto, MySQL convierte cadenas de izquierda a derecha. Ejemplos:
fuente
1
decimal
.Otra forma, sin usar un solo molde.
(Para las personas que usan JPA 2.0, donde no se permite la transmisión)
EDITAR: solo funciona para enteros positivos
fuente
Otra forma simple
ORDER BY ABS(column_name)
fuente
La columna con la que estoy ordenando tiene cualquier combinación de alfa y numérico, por lo que utilicé las sugerencias en esta publicación como punto de partida y se me ocurrió esto.
Resultados
Espero que esto ayude
fuente
1 - ISNUMERIC(ID)
lugar de(CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END)
cambiar de 0 a 1 y viceversa.Esto funciona para mi.
fuente
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 hacer que todas las cadenas enteras tengan la misma longitud.
u ordenar por parte de un campo algo como 'tensymbols13', 'tensymbols1222' etc.
fuente
Estaba buscando también un campo de clasificación que tenga un prefijo de letra. Aquí es lo que descubrí la solución. Esto podría ayudar a quién está buscando la misma solución.
Valores de campo:
SUBSTRING(field,3,9)
Puse 9 porque 9 es suficiente para mantener valores enteros de máximo 9 dígitos.Entonces el resultado será 123456789 123456788 123456787 ... 100 99 ... 2 1
fuente
Esto manejará números negativos, fracciones, cadenas, todo:
fuente
Podría ayudar a quién está buscando la misma solución.
fuente
Si está utilizando AdonisJS y tiene ID mixtos como ABC-202, ABC-201 ..., puede combinar consultas sin procesar con Query Builder e implementar la solución anterior ( https://stackoverflow.com/a/25061144/4040835 ) como sigue:
NOTAS: En esta línea:
SUBSTRING(:sortField:,3,15)*1 ${sortDirection}
,Ref. 1: puede leer más sobre enlaces de parámetros en consultas sin procesar aquí: https://knexjs.org/#Raw-Bindings Ref. 2: Adonis Raw Queries: https://adonisjs.com/docs/4.1/query-builder# _raw_queries
fuente
Modifique su campo para que sea INT en lugar de VARCHAR.
Luego arregle las circunstancias dependientes primero. De lo contrario, está trabajando en torno al problema subyacente real. Usar un CAST de MySQL es una opción, pero está enmascarando su esquema incorrecto que debería corregirse.
fuente