Ordenando la columna nvarchar como entero
-
02-07-2019 - |
Pregunta
He mezclado datos i columna nvarchar (palabras y números). ¿Cuál es la forma más rápida de ordenar los datos en esta columna en orden numérico
Ejemplo de resultado:
- 1
- 2
- 3
- ...
- 10
- 11
- ...
- aaaa
- aaab
- b
- ba
- ba
- ...
Solución
Usa esto:
ORDER BY
CASE WHEN ISNUMERIC(column) = 1 THEN 0 ELSE 1 END,
CASE WHEN ISNUMERIC(column) = 1 THEN CAST(column AS INT) ELSE 0 END,
column
Esto funciona como se esperaba.
Nota : dices forma más rápida . Este sql fue rápido para mi producción, pero el plan de ejecución muestra una exploración de tabla, seguida de un cálculo escalar. Esto posiblemente podría producir un resultado temporal que contenga todos los valores de esa columna con algunas columnas temporales adicionales para los resultados ISNUMERIC. Puede que no sea rápido de ejecutar.
Otros consejos
Si dejó el teclado en sus números con 0 y ordenó eso, obtendrá los resultados deseados. Deberás asegurarte de que el número de 0 con el que rellenas coincida con el tamaño de la columna varchar.
Echa un vistazo a este ejemplo ...
Declare @Temp Table(Data VarChar(20))
Insert Into @Temp Values('1')
Insert Into @Temp Values('2')
Insert Into @Temp Values('3')
Insert Into @Temp Values('10')
Insert Into @Temp Values('11')
Insert Into @Temp Values('aaaa')
Insert Into @Temp Values('aaab')
Insert Into @Temp Values('b')
Insert Into @Temp Values('ba')
Insert Into @Temp Values('ba')
Select * From @Temp
Order By Case When IsNumeric(Data) = 1
Then Right('0000000000000000000' + Data, 20)
Else Data End
También tenga en cuenta que cuando se utiliza una declaración de caso, es importante que cada rama de la declaración de caso devuelva el mismo tipo de datos, de lo contrario obtendrá resultados incorrectos o un error.
- comprobar la existencia
si existe (seleccione * de dbo.sysobjects donde [id] = object_id (N'dbo.t ') AND objectproperty (id, N'IsUserTable') = 1)
drop table dbo.t
ir
--crear tabla de ejemplo
crear tabla dbo.t (c varchar (10) no nulo)
configurar nocount en
--popular ejemplo de tabla
Insertar en los valores de dbo.t (c) ('1')
Insertar en los valores de dbo.t (c) ('2')
Insertar en los valores de dbo.t (c) ('3')
Insertar en los valores de dbo.t (c) ('10 ')
Insertar en los valores de dbo.t (c) ('11')
Insertar en los valores de dbo.t (c) ('aaaa')
Insertar en los valores de dbo.t (c) ('aaab')
Insertar en los valores de dbo.t (c) ('b')
Insertar en los valores de dbo.t (c) ('ba')
Insertar en los valores de dbo.t (c) ('ba')
- devuelve los datos
seleccione c desde dbo.t
orden por caso cuando isnumeric (c) = 1 luego 0 else 1 end,
caso cuando isnumeric (c) = 1 luego emitido (c como int) else 0 end,
c
Puede tratar los datos como alfanuméricos o numéricos, no ambos al mismo tiempo. No creo que lo que intentas hacer sea posible, el modelo de datos no está configurado correctamente.
No creo que lo que estás tratando de hacer es posible
Este ejemplo funciona bien
SELECT * FROM TableName
ORDER BY CASE WHEN 1 = IsNumeric(ColumnName) THEN Cast(ColumnName AS INT) END
El resultado es:
- a
- b
- c
- ...
- 1
- 2
- 3
Pero primero necesito números.
Esto debería funcionar:
select * from Table order by ascii(Column)
Echalo.
SELECT * FROM foo ORDER BY CAST(somecolumn AS int);
Ha pasado un tiempo desde que toqué SQL Server, por lo que mi sintaxis podría ser completamente incorrecta, sin embargo :)