Estoy intentando ordenar por una columna numérica en mi base de datos que tiene valores 1-999
Cuando uso
ORDER_BY registration_no ASC
Yo obtengo….
1
101
102
103
104
105
106
107
108
109
11
110
Etc…
Así que parece estar ordenando por el primer dígito en oposición al número.
¿Alguien sabe qué SQL usar si quiero ordenar esto por valor? Entonces, 1,2,3,4,5,6
etc.
sql
sql-order-by
Konnor262
fuente
fuente
order by registration_no + 0 asc
para resolver su problema.Respuestas:
Una forma de ordenar por enteros positivos, cuando se almacenan como
varchar
, es ordenar primero por la longitud y luego por el valor:Esto es particularmente útil cuando la columna puede contener valores no numéricos.
Nota: en algunas bases de datos, la función para obtener la longitud de una cadena podría llamarse en
length()
lugar delen()
.fuente
order by
tiene poco efecto sobre el rendimiento.length()
lugar delen()
convierte explícitamente el valor en un número. Otra posibilidad de lograr lo mismo sería
lo que forzará una conversación implícita.
En realidad, debería comprobar la definición de la tabla y cambiarla. Puede cambiar el tipo de datos a Me
int
gusta estoALTER TABLE your_table MODIFY COLUMN registration_no int;
fuente
Si está utilizando SQL Server:
fuente
da el resultado deseado con advertencias.
Por lo tanto, es mejor ir por
para un resultado limpio sin advertencias SQL.
fuente
Supongo que su tipo de columna es STRING (CHAR, VARCHAR, etc.) y el procedimiento de clasificación lo clasifica como una cadena. Lo que debe hacer es convertir el valor en valor numérico. Cómo hacerlo dependerá del sistema SQL que utilice.
fuente
A veces simplemente no tiene la opción de almacenar números mezclados con texto. En una de nuestras aplicaciones, el host del sitio web que utilizamos para nuestro sitio de comercio electrónico crea filtros dinámicamente a partir de listas. No hay ninguna opción para ordenar por ningún campo que no sea el texto mostrado. Cuando queríamos que los filtros se construyeran a partir de una lista que dijera cosas como 2 "a 8" 9 "a 12" 13 "a 15", etc., lo necesitábamos para ordenar 2-9-13, no 13-2-9 como ocurrirá cuando leer los valores numéricos. Así que utilicé la función de replicación de SQL Server junto con la longitud del número más largo para rellenar los números más cortos con un espacio inicial. Ahora 20 se ordena después de 3, y así sucesivamente.
Estaba trabajando con una vista que me dio las longitudes, anchos, etc. mínimos y máximos para el tipo de elemento y la clase, y aquí hay un ejemplo de cómo hice el texto. (LB n Low y LB n High son los extremos inferior y superior de los 5 soportes de longitud).
fuente
Prefiero hacer un "PAD" a los datos. MySql lo llama LPAD, pero puede trabajar para hacer lo mismo en SQL Server.
ORDER BY REPLACE(STR(ColName, 3), SPACE(1), '0')
Esta fórmula proporcionará ceros iniciales basados en la longitud de la columna de 3. Esta funcionalidad es muy útil en otras situaciones fuera de ORDER BY, por eso quería proporcionar esta opción.
Resultados: 1 se convierte en 001 y 10 se convierte en 010, mientras que 100 permanece igual.
fuente
Este problema se debe simplemente a que ha declarado la columna en el tipo de datos CHAR, VARCHAR o TEXT. Simplemente cambie el tipo de datos a INT, BIGINT, etc. Esto resolverá el problema de su pedido personalizado.
fuente