sql >> Base de Datos >  >> RDS >> Sqlserver

Clasificación alfanumérica

Aquí hay un consejo:cada vez que tenga problemas con la ordenación, agregue orden por elementos a su cláusula de selección. esto le permitirá ver si lo que está ordenando es realmente lo que quiere ordenar:

SELECT Section,
        CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
          LEFT(Section,PATINDEX('%[0-9]%',Section)-1)
        ELSE 
          Section
        END As alphabetical_sort, -- alphabetical sort
        CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
          CAST(SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section)) as float)
        ELSE
          NULL
        END As Numeric_Sort
FROM dbo.Section
ORDER BY alphabetical_sort, Numeric_Sort

Después de ordenar correctamente, todo lo que tenía que hacer era mover las declaraciones de casos a la cláusula order by:

SELECT Section
FROM dbo.Section
ORDER BY 
    CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
        LEFT(Section,PATINDEX('%[0-9]%',Section)-1)
    ELSE 
        Section
    END , -- Alphabetical sort
    CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
        CAST(SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section)) as float)
    ELSE
        NULL
    END  -- Numeric sort

Básicamente, tenía 4 problemas principales:

  • Su expresión de clasificación alfabética asumió que cada fila tiene números.
  • Su expresión de clasificación alfabética contenía los números además del texto.
  • Su expresión de clasificación numérica tenía valores numéricos y alfabéticos.
  • Debido al artículo 3, no puede convertir su expresión de clasificación numérica a un tipo numérico, y es por eso que obtendría una clasificación de cadena.

Vea este violín sql