Tengo una base de datos con una columna VARCHAR que contiene enteros de longitud variable. Quiero ordenarlos para que 10 venga después de 9, no 1, y 70A venga después de 70. Pude hacer esto con PATINDEX () , un CTE y declaraciones CASE en la cláusula WHERE.
Sin embargo, me preguntaba si había una recopilación donde esto sería innecesario.
sql-server
collation
sorting
natural-sort
Justin Dearing
fuente
fuente
Respuestas:
No. La clasificación se trata de la clasificación alfabética, según la página de códigos, el acento, el caso, el ancho, el kana. Los caracteres de números (0-9) no tienen ninguna de sus propiedades.
Por
9
lo tanto, siempre es después10B
de cualquier tipo.Tienes que dividirlo como has notado
o ordenar de esta manera:La longitud a la derecha determina cuántos espacios tienes.Por supuesto que podrías:
justificar a la derecha en un char (una versión almacenada de mi DERECHA anterior)Las últimas 2 sugerencias son como mi DERECHA anterior y ligeramente diferentes. Más rápido de clasificar (no se necesita procesar el colukmn) pero se requiere más almacenamiento
fuente
9
is after after10B
in any sort. ": Es solo así en SQL Server porque la opción de clasificación subyacente para manejar "DigitsAsNumbers" no se ha expuesto como una opción de Intercalación. Todavía ;-). Esto se hizo disponible para aplicaciones basadas en Windows a partir de Windows 7, especialmente en el Explorador de archivos. Y un día puede estar expuesto a SQL Server, si suficientes personas apoyan la idea. Traté de hacer que la pelota rodara presentando la siguiente sugerencia de Connect: admite "clasificación natural" / DIGITSASNUMBERS como una opción de clasificación .Configuraría una columna calculada y luego ordenaría según eso. Algo como
Luego use esta columna para ordenar, ya que ahora puede indexar la columna.
fuente
Si desea una forma dolorosa de demostrar lo que dice @gbn (esencialmente que no puede distinguir una clasificación para ordenar subcadenas de manera diferente), puede hacer una tabla rápida #temp que tenga un coeficiente para el orden que espera, y ver si ordenar por cualquier colación devuelve el mismo orden:
Esto funciona para mí en aproximadamente 10 segundos y produce 0 filas, lo que significa que no hay clasificación disponible para SQL Server (al menos 2008 R2, no he probado Denali) se ordenará de la manera que espera. Necesita una forma diferente de definir la ordenación.
fuente
¿Desea un medio sensato y eficiente para clasificar los números en cadenas como números reales? Considere votar por mi sugerencia de Microsoft Connect: soporte "clasificación natural" / DIGITSASNUMBERS como una opción de clasificación
Si bien esta pregunta es específica de SQL Server, y esta respuesta no lo es, sentí que aún debería publicar esta información simplemente para dar a conocer y no oponerme a ninguna de las otras respuestas.
Dicho esto, fuera de SQL Server, en ciertos entornos es posible hacer este tipo de clasificación. Es algo que al menos se especifica en la documentación de Unicode. En el LENGUAJE DE MARCADO DE DATOS LOCALES UNICODE (LDML) PARTE 5: estándar / informe COLLATION , hay un gráfico para la Configuración de clasificación que describe varias opciones para adaptar el comportamiento de clasificación. Una de las opciones es
-kn-true
o[numericOrdering on]
:Sin embargo, este documento es un "estándar técnico" y no forma parte de la especificación central de Unicode. Una nota en la parte superior del documento dice:
Por lo tanto, este comportamiento particular no está disponible en SQL Server o incluso en .NET (al menos no de forma nativa), aunque ambos se ajustan a la especificación central de Unicode.
El proyecto ICU (International Components for Unicode) es un conjunto de bibliotecas C / C ++ y Java que implementa esta funcionalidad, e incluso hay una demostración en línea de la misma. Y bajo "proyectos relacionados" hay un enlace a un proyecto .NET que parece ser un contenedor de objetos COM para la biblioteca ICU que permitiría que esta funcionalidad se exponga al código administrado. Pero no está claro si ese proyecto .NET aún está activo.
Pero para ver este comportamiento en acción, vaya a la demostración de colación de UCI .
Pegue lo siguiente en el área de texto de entrada en el lado izquierdo:
Establezca todas las opciones en "predeterminado". Marque la opción "ingresar números de línea" a la derecha del sortbotón y asegúrese de que la opción "intensidades de diferencia" no esté marcada.
Haga clic en el sortbotón y debería recuperar lo siguiente:
Esto es lo que se debe esperar al hacer una ordenación de cadena típica y lo que está viendo en SQL Server.
Ahora, en la serie de botones de radio justo encima del sortbotón, la segunda fila está etiquetada como "numérica". Seleccione el botón de opción "encendido".
Vuelva a hacer clic en el sortbotón y debería recuperar lo siguiente:
¿Se pregunta si esto funciona cuando la porción numérica está en el medio de la cadena? Ok, pegue lo siguiente en el área de texto de entrada en el lado izquierdo (reemplazando la lista anterior):
Asegúrese de que la configuración numérica todavía esté establecida en "on". Vuelva a hacer clic en el sortbotón y debería recuperar lo siguiente:
¿Quieres ver esto en otro lugar? Cree una carpeta en su disco duro, algo así como C: \ temp \ sorting \ , y cree archivos vacíos con los mismos nombres "Script -...". Haga una
DIR
en una ventana de comandos y verá la clasificación estándar. Pero al mirar la lista de archivos en el Explorador de Windows, verá la lista ordenada con la opción "numérica" :-).fuente