sql - Tipo complejo de campo "string-number-string"
mysql order alphanumeric (2)
Básicamente, estoy tratando de ordenar una tabla por su nombre. La tabla es relativamente grande, pero solo publico una columna, por ejemplo. La columna es la estación de abajo
Station
===
ANTIL WELL 1
ANTIL WELL 2
BASELINE & CALIFORNIA WELL
EPA WELL 6
EPA WELL 7
EPA WELL 108
EPA WELL 109
EPA WELL 110
EPA WELL 111
EPA WELL 112
EPA WELL 108S
El tipo de arriba fue logrado por mí tratando esto:
order by left(station,LEN(station) -PATINDEX(''%[^0-9]%'',REVERSE(station))+1)
,CONVERT(int,REVERSE(LEFT(REVERSE(station), PATINDEX(''%[^0-9]%'',REVERSE(station)) - 1)))
Sin embargo, simplemente no puedo ordenar ese EPA WELL 108S. Necesito que vaya entre EPA WELL 108 y EPA WELL 109, probé de muchas maneras diferentes.
También la lista de estaciones continúa después de EPA.
Necesito que vaya entre EPA WELL 108 y EPA WELL 109
Entonces no estás clasificando por nombre; lo estás ordenando por subcomponentes separados que también están incorporados en la columna de nombre, pero en una secuencia diferente. Debe crear columnas para cada subcomponente y ordenarlas por los subcomponentes:
Name sc1 sc2 sc3
EPA WELL 108 EPA WELL 108
EPA WELL 6 EPA WELL 6
EPA WELL 7 EPA WELL 7
EPA WELL 109 EPA WELL 109
EPA WELL 108s EPA WELL 108 s
Luego puede usar una cláusula ORDER BY como:
ORDER BY sc1, sc2, sc3
Si desea evitar la duplicación de datos, elimine la columna Nombre y ensamble su nombre para mostrar de los subcomponentes:
SELECT sc1 + '' '' + Convert(VarChar, sc2) + sc3 AS Name
Es rápido y fácil catenear un nombre en tiempo de ejecución. No es rápido ni fácil de clasificar por subcomponentes de tamaño variable de un VarChar en tiempo de ejecución.
Esta solución es más confiable que la respuesta elegida. Esta respuesta puede no dar la respuesta esperada si hay más de 1 número como ''EPA WELL 5 7'' en la estación. Esta solución está rellenando el número con ''0'', por lo que la comparación considerará todos los números con 8 dígitos.
DECLARE @Table1 table([station] varchar(26))
INSERT INTO @Table1
([station])
VALUES
(''ANTIL WELL 2''),
(''ANTIL WELL 1''),
(''BASELINE & CALIFORNIA WELL''),
(''EPA WELL 7''),
(''EPA WELL 6''),
(''EPA WELL 108''),
(''EPA WELL 109''),
(''EPA WELL 110''),
(''EPA WELL 111''),
(''EPA WELL 112''),
(''EPA WELL 108S''),
(''EPA WELL 111108'')
;
SELECT station
FROM @table1
ORDER BY
CASE WHEN station not like ''%[0-9]%'' THEN station ELSE
STUFF(station, PATINDEX(''%[0-9]%'',station), 0, replicate(''0'',
PATINDEX(''%[0-9]%'',station) - len(station) + PATINDEX(''%[0-9]%'',reverse(station)) + 6))
END
* La respuesta de GoatCD no dará el orden correcto en mis datos de prueba.