Discussion:
Ordenar tabla alfanumerica como numerica
(demasiado antiguo para responder)
Antonio
2003-11-16 22:11:08 UTC
Permalink
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,
Eladio Rincón
2003-11-16 22:29:30 UTC
Permalink
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
Post by Antonio
1
11
111
2
a-1
3
33
b-1
4
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,
Antonio
2003-11-16 23:12:06 UTC
Permalink
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" <***@torrevieja.infoville.net> escribi� en el mensaje news:***@TK2MSFTNGP10.phx.gbl...
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
Post by Antonio
1
11
111
2
a-1
3
33
b-1
4
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,
Diego Buendia
2003-11-17 13:39:07 UTC
Permalink
Post by Antonio
1
11
111
2
a-1
3
33
b-1
4
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.
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

-- El replace es para equiparar a2 con b-2, por ejemplo ----
-- (eliminar caracteres no procedentes para la comparación) ----

Saludos,

Diego Buendia
Barcelona Spain
Antonio
2003-11-17 16:01:02 UTC
Permalink
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
Post by Diego Buendia
Post by Antonio
1
11
111
2
a-1
3
33
b-1
4
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.
A falta de conocer mejor el universo de valores que tiene tu tabla,
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
-- El replace es para equiparar a2 con b-2, por ejemplo ----
-- (eliminar caracteres no procedentes para la comparación) ----
Saludos,
Diego Buendia
Barcelona Spain
Diego Buendia
2003-11-18 15:35:49 UTC
Permalink
Post by Antonio
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?
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
Antonio
2003-11-20 06:01:43 UTC
Permalink
Estupendo Diego... muchisimas gracias...

Por otra parte... si tengo atado la mayoria de los caracteres a traves de
codigo.... pero se empeño en usar otros caracteres y no hubo forma de
convencerlo.
Una vez mas... muchas gracias
Antonio Punta
Post by Diego Buendia
Post by Antonio
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?
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
Continúe leyendo en narkive:
Loading...