Ordenar tabla alfanumerica como numerica

16/11/2003 - 23:11 por Antonio | Informe spam
Es decir, tengo una tabla con valores alfanumericos:

1
11
111
2
a-1
3
33
b-1
4
y deseo que se ordenen de forma numerica:
1
2
3
4
11
33
111
a-1
b-1
He probado de todo y no se como hacerlo con las funciones convert me da
error pues valores alfanumericos no se pueden convertir a numericos.

Saludos,

Preguntas similare

Leer las respuestas

#1 Eladio Rincón
16/11/2003 - 23:29 | Informe spam
Hola Antonio,

prueba esto:

CREATE TABLE FOO2 ( valor char(10))
go

insert into foo2 values ( '1' )
insert into foo2 values ( '11' )
insert into foo2 values ( '10' )
insert into foo2 values ( '2' )
insert into foo2 values ( '1' )
insert into foo2 values ( 'a-1' )
insert into foo2 values ( 'b1' )

go

select *
from foo2
order by
case when isnumeric ( valor ) = 1
then cast ( valor as integer )
else 99999999
end
asc


Eladio Rincón
SQL Server MVP
http://eladio.europe.webmatrixhosting.net

"Comparte lo que sabes, aprende lo que no sepas." FGG

"Antonio" escribió en el mensaje news:u7v%
Mostrar la cita
#2 Antonio
17/11/2003 - 00:12 | Informe spam
Eladio.. creo que vamos por buen camino,

Me ordenan en primera instancia todos los valores numericos.. pero me deja
sin ordenar los alfanumericos... me los muestra en el orden que fueron
introducidos... ej:

1
2
3
6
11
a-1
a-8
a-5
a-4
a3

Gracias por tu ayuda.



"Eladio Rincón" escribió en el mensaje
news:
Hola Antonio,

prueba esto:

CREATE TABLE FOO2 ( valor char(10))
go

insert into foo2 values ( '1' )
insert into foo2 values ( '11' )
insert into foo2 values ( '10' )
insert into foo2 values ( '2' )
insert into foo2 values ( '1' )
insert into foo2 values ( 'a-1' )
insert into foo2 values ( 'b1' )

go

select *
from foo2
order by
case when isnumeric ( valor ) = 1
then cast ( valor as integer )
else 99999999
end
asc


Eladio Rincón
SQL Server MVP
http://eladio.europe.webmatrixhosting.net

"Comparte lo que sabes, aprende lo que no sepas." FGG

"Antonio" escribió en el mensaje
news:u7v%
Mostrar la cita
#3 dbuendiab
17/11/2003 - 14:39 | Informe spam
"Antonio" wrote in message news:<u7v#...
Mostrar la cita
A falta de conocer mejor el universo de valores que tiene tu tabla,
para los que muestras sirve una cosa así:

CREATE TABLE T ( valor char(10))
go

insert into T values ( '1' )
insert into T values ( '11' )
insert into T values ( '111' )
insert into T values ( '2' )
insert into T values ( 'a-1' )
insert into T values ( '3' )
insert into T values ( '33' )
insert into T values ( 'b-1' )
insert into T values ( '4' )
insert into T values ( 'a2' )
insert into T values ( 'b-3' )

go

SELECT
VALOR -- Supuesto que sea un CHAR(10) -
FROM T
ORDER BY
CASE WHEN ISNUMERIC(VALOR) = 1
THEN RIGHT( '0000000000' + VALOR, 10 )
ELSE RIGHT( 'AAAAAAAAAA' + REPLACE(VALOR,'-',''), 10 ) END


Saludos,

Diego Buendia
Barcelona Spain
#4 Antonio
17/11/2003 - 17:01 | Informe spam
Ok... es perfecto Una ultima pregunta... si es mas de un caracter
indefinido es decir.. ha escrito por ejemplo A-3 y/o A/7, el ejemplo
detecta '-', pero ¿podria detectar otros mas a parte de este?

Saludos, y perdonad tanta pregunta.
Muchas gracias

"Diego Buendia" escribió en el mensaje
news:
Mostrar la cita
news:<u7v#...
Mostrar la cita
#5 dbuendiab
18/11/2003 - 16:35 | Informe spam
"Antonio" wrote in message news:...
Mostrar la cita
Puedes anidar los REPLACES...

REPLACE( REPLACE( VALOR, '-', '' ), '/', '' ) etc

pero también le podrías limitar al usuario la entrada de datos para
que no te metiera basura (¿atándole las manos, quizás?) :)

Saludos,

Diego Buendia
Barcelona Spain
Ads by Google
Search Busqueda sugerida