Tenemos una gran base de datos en la que tenemos una paginación de lado de DB. Esto es rápido, devolviendo una página de 50 filas de millones de registros en una pequeña fracción de segundo.Clasificación natural (humano alfanumérico) en Microsoft SQL 2005
Los usuarios pueden definir su propio tipo, básicamente eligiendo qué columna ordenar. Las columnas son dinámicas, algunas tienen valores numéricos, algunas fechas y texto.
Mientras que la mayoría clasifica como el texto esperado, ordena de una manera tonta. Bueno, digo tonto, tiene sentido para las computadoras, pero frustra a los usuarios.
Por ejemplo, la clasificación por un ID de registro de cadena da algo así como:
rec1
rec10
rec14
rec2
rec20
rec3
rec4
... y así sucesivamente.
Quiero que esto tiene en cuenta el número, así:
rec1
rec2
rec3
rec4
rec10
rec14
rec20
no puedo controlar la entrada (de lo contrario estaría solo formato en el que lleva 000s) y no puedo confiar en un solo formato - algunos son cosas como "{código alfa} - {departamento código} - {rec id}".
Conozco algunas formas de hacer esto en C#, pero no puedo seleccionar todos los registros para ordenarlos, ya que eso sería reducir la velocidad.
¿Alguien sabe una forma de aplicar rápidamente una ordenación natural en el servidor Sql?
Estamos usando:
ROW_NUMBER() over (order by {field name} asc)
Y entonces estamos paginación por eso.
Podemos agregar activadores, aunque no lo haríamos. Toda su entrada está parametrizada y similares, pero no puedo cambiar el formato; si ponen "rec2" y "rec10", esperan que se devuelvan así, y en orden natural.
Tenemos una entrada de usuario válida que sigue diferentes formatos para diferentes clientes.
Uno podría ir REC1, REC2, REC3, ... rec100, rec101
mientras que otro puede ir: grp1rec1, grp1rec2, ... grp20rec300, grp20rec301
Cuando digo que no podemos controlar la entrada quiero decir que no podemos obligar a los usuarios a cambiar estos estándares; tienen un valor como grp1rec1 y no puedo reformatearlo como grp01rec001, ya que eso estaría cambiando algo usado para búsquedas y enlaces a sistemas externos.
Estos formatos varían mucho, pero a menudo son mezclas de letras y números.
Ordenar estos en C# es fácil - solo divídalo en { "grp", 20, "rec", 301 }
y luego compare los valores de secuencia sucesivamente.
Sin embargo, puede haber millones de registros y los datos están paginados, necesito que la clasificación se haga en el servidor SQL.
El servidor SQL ordena por valor, no por comparación: en C# puedo dividir los valores para comparar, pero en SQL necesito un poco de lógica que (muy rápidamente) obtiene un único valor que ordena constantemente.
@moebius - su respuesta podría funcionar, pero se siente como un compromiso feo para agregar una clave de clasificación para todos estos valores de texto.
Esta pregunta es un poco viejo, pero he añadido una solución basada en CLR que se me ocurrió, que podrían ayudar a alguien más ... – RedFilter
No es una [artículo horror Codificación] (http : //www.codinghorror.com/blog/archives/001018.html) con respecto al tipo natural. De los comentarios parece que esta característica no está disponible en SQL Server. –
Si bien la respuesta de @ RedFilter, así como la mejora de Roman Starkov en la respuesta de RedFilter, son buenas, la solución óptima sería que SQL Server manejara esto internamente mediante una propiedad de intercalación. Esto ya es posible en el sistema operativo ya que se está utilizando en el Explorador de archivos al ordenar los archivos por nombre (a partir de Windows 7, tal vez). Vota por mi sugerencia de conexión de Microsoft para que esta característica esté integrada en SQL Server para que, de hecho, realmente suceda: https://connect.microsoft.com/SQLServer/feedback/details/2932336/support-natural-sorting-digitsasnumbers-as -a-colación-opción –