number sql sql-server sql-server-2008 tsql natural-sort

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.