25/01/2012, 16:20
|
| Colaborador | | Fecha de Ingreso: agosto-2006 Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses Puntos: 774 | |
Respuesta: Orden Select "Natural" Cita:
Iniciado por Andres95 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 |