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
  • ...
¿Fue útil?

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 :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top