Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Orden Select "Natural"

Estas en el tema de Orden Select "Natural" en el foro de SQL Server en Foros del Web. Hola quisiera saber como puedo lograr un orden natural (como lo ordenaría un humano), con datos nvarchar, ej: (Tipo) V1 V2 1 2 10 11 ...
  #1 (permalink)  
Antiguo 24/01/2012, 10:59
Avatar de Highlander  
Fecha de Ingreso: junio-2006
Ubicación: Concepción, Chile
Mensajes: 475
Antigüedad: 18 años, 5 meses
Puntos: 4
Orden Select "Natural"

Hola quisiera saber como puedo lograr un orden natural (como lo ordenaría un humano), con datos nvarchar, ej:

(Tipo)
V1
V2
1
2
10
11
1-V1
2-B11
10-A23
11-A23
12-A11
PV8

Cosa que quede ordenado así:
1
1-V1
2
2-B11
10
10-A23
11
11-A23
12-A11
PV8
V1
V2

He probado varios ORDER BY len(Tipo), Tipo pero no logro el resultado deseado.
__________________
Ingeniero (E) en Computación e Informática
The last man alone with god.
  #2 (permalink)  
Antiguo 24/01/2012, 12:08
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 11 meses
Puntos: 38
Respuesta: Orden Select "Natural"

Suponiendo que son dos partes concatenadas dentro de un mismo campo...

Separandolas se ordena por ambos campos y para que las que no tienen parte numerica vayan al final se toman como 99999

Podriamos hacer..

Código:
SELECT   TEXTO
        ---------------------------------------------------------------------------------------------------
       , 
         CASE WHEN ISNUMERIC(TEXTO) = 1        THEN RIGHT('00000' + TEXTO, 5)	 
              WHEN CHARINDEX('-',TEXTO, 1) > 0 THEN RIGHT('00000' + SUBSTRING(TEXTO, 1, CHARINDEX('-',TEXTO, 1) - 1), 5) 
              ELSE '99999' END  [PARTE NUMERICA]
        ---------------------------------------------------------------------------------------------------
       , CASE WHEN ISNUMERIC(TEXTO) = 1        THEN ''
              WHEN CHARINDEX('-',TEXTO, 1) > 0 THEN SUBSTRING(TEXTO, CHARINDEX('-',TEXTO, 1), LEN(TEXTO)) 
              ELSE TEXTO END [PARTE TEXTO]             
--SUBSTRING(TEXTO, 1, 
FROM (
SELECT 'V2' TEXTO
UNION ALL
SELECT 'V1'
UNION ALL
SELECT '1'
UNION ALL
SELECT '2'
UNION ALL
SELECT '10'
UNION ALL
SELECT '11'
UNION ALL
SELECT '1-V1'
UNION ALL
SELECT '2-B11'
UNION ALL
SELECT '10-A23'
UNION ALL
SELECT '11-A23'
UNION ALL
SELECT '12-A11'
UNION ALL
SELECT 'PV8'
) S
ORDER BY 2,3
Resultando:

Código:
TEXTO  PARTE NUMERICA PARTE TEXTO
------ -------------- -----------
1      00001          
1-V1   00001          -V1
2      00002          
2-B11  00002          -B11
10     00010          
10-A23 00010          -A23
11     00011          
11-A23 00011          -A23
12-A11 00012          -A11
PV8    99999          PV8
V1     99999          V1
V2     99999          V2

(12 row(s) affected)
Es solo plasmar en un flujo logico las operaciones que mentalmente hacemos sin darnos cuenta..




Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.

Última edición por Andres95; 24/01/2012 a las 16:31
  #3 (permalink)  
Antiguo 24/01/2012, 18:22
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Orden Select "Natural"

Una forma rápida que podrías probar es, suponiendo la columna tipo varchar(10)

Código:
order by replicate('0',10-len(tipo))+tipo
Saludos
  #4 (permalink)  
Antiguo 25/01/2012, 16:20
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Orden Select "Natural"

Cita:
Iniciado por Andres95 Ver Mensaje
Suponiendo que son dos partes concatenadas dentro de un mismo campo...

Separandolas se ordena por ambos campos y para que las que no tienen parte numerica vayan al final se toman como 99999

Podriamos hacer..

Código:
SELECT   TEXTO
        ---------------------------------------------------------------------------------------------------
       , 
         CASE WHEN ISNUMERIC(TEXTO) = 1        THEN RIGHT('00000' + TEXTO, 5)	 
              WHEN CHARINDEX('-',TEXTO, 1) > 0 THEN RIGHT('00000' + SUBSTRING(TEXTO, 1, CHARINDEX('-',TEXTO, 1) - 1), 5) 
              ELSE '99999' END  [PARTE NUMERICA]
        ---------------------------------------------------------------------------------------------------
       , CASE WHEN ISNUMERIC(TEXTO) = 1        THEN ''
              WHEN CHARINDEX('-',TEXTO, 1) > 0 THEN SUBSTRING(TEXTO, CHARINDEX('-',TEXTO, 1), LEN(TEXTO)) 
              ELSE TEXTO END [PARTE TEXTO]             
--SUBSTRING(TEXTO, 1, 
FROM (
SELECT 'V2' TEXTO
UNION ALL
SELECT 'V1'
UNION ALL
SELECT '1'
UNION ALL
SELECT '2'
UNION ALL
SELECT '10'
UNION ALL
SELECT '11'
UNION ALL
SELECT '1-V1'
UNION ALL
SELECT '2-B11'
UNION ALL
SELECT '10-A23'
UNION ALL
SELECT '11-A23'
UNION ALL
SELECT '12-A11'
UNION ALL
SELECT 'PV8'
) S
ORDER BY 2,3
Resultando:

Código:
TEXTO  PARTE NUMERICA PARTE TEXTO
------ -------------- -----------
1      00001          
1-V1   00001          -V1
2      00002          
2-B11  00002          -B11
10     00010          
10-A23 00010          -A23
11     00011          
11-A23 00011          -A23
12-A11 00012          -A11
PV8    99999          PV8
V1     99999          V1
V2     99999          V2

(12 row(s) affected)
Es solo plasmar en un flujo logico las operaciones que mentalmente hacemos sin darnos cuenta..




Saludos!
Excelente aporte :) muy buena logica :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 27/01/2012, 11:15
 
Fecha de Ingreso: enero-2012
Mensajes: 9
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Orden Select "Natural"

Cita:
Iniciado por Highlander Ver Mensaje
Hola quisiera saber como puedo lograr un orden natural (como lo ordenaría un humano), con datos nvarchar, ej:

(Tipo)
V1
V2
1
2
10
11
1-V1
2-B11
10-A23
11-A23
12-A11
PV8

Cosa que quede ordenado así:
1
1-V1
2
2-B11
10
10-A23
11
11-A23
12-A11
PV8
V1
V2

He probado varios ORDER BY len(Tipo), Tipo pero no logro el resultado deseado.
No probaste con ORDER BY 1?
  #6 (permalink)  
Antiguo 27/01/2012, 12:31
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Orden Select "Natural"

Jose20

Order by #

El #, reemplaza a la columna, contando de izquierda a derecha, por lo tanto, dudo mucho que de el resultado esperado.
__________________
MCTS Isaias Islas

Etiquetas: orden, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:58.