2010-07-01 13 views
7

Tengo una columna que normalmente es solo números (a veces son letras, pero eso no es importante).Clasificación natural para SQL Server?

¿Cómo puedo hacer que sea de tipo natural?

Actualmente géneros como esto: {} 1,10,11,12,2,3,4,5,6,7,8,9

lo quiero para ordenar así: {1,2 , 3,4,5,6,7,8,9,10,11,12}

Respuesta

6

IsNumeric está "roto", ISNUMERIC (CHAR (13)) devuelve 1 y CAST fallará.

Utilice ISNUMERIC (textval + 'e0'). código final:

ORDER BY 
    PropertyName, 
    CASE ISNUMERIC(MixedField + 'e0') WHEN 1 THEN 0 ELSE 1 END, -- letters after numbers 
    CASE ISNUMERIC(MixedField + 'e0') WHEN 1 THEN CAST(MixedField AS INT) ELSE 0 END, 
    MixedField 

Usted puede mezclar parámetros de orden ...

+0

Casi allí, eso no ordena no numérico simplemente los agrega de cualquier manera hasta el final. Modifico tu consulta y la acepto – Malfist

-3

¿Ha atado usando:

'OrdenarPor ColumnName Asc'

al final de la consulta.

+8

Eso no es una especie natural, que es un tipo ASCII. – Malfist

1

Cast it. Además, no olvides utilizar IsNumeric para asegurarte de que solo recuperas los números (si incluyen letras, ES IMPORTANTE;).

SELECT textval FROM tablename 
WHERE IsNumeric(textval) = 1 
ORDER BY CAST(textval as int) 

También, emitir para el tipo de datos que tendrá el mayor valor.

Si necesita los no números en el conjunto de resultados también, solo agregue una consulta UNION donde IsNumeric = 0 (ordene por lo que desee) antes o después.

+0

El problema con la unión es que este tipo no es del tipo de primer nivel. El primer tipo es por Nombre de propiedad, y este tipo es por Número de unidad (normalmente numérico, pero podría ser A, B, C, ...) La unión arrojaría un lote – Malfist

Cuestiones relacionadas