Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Classificação alfanumérica


Aqui vai uma dica:Sempre que você estiver tendo problemas com a classificação, adicione ordem por itens à sua cláusula select. isso permitirá que você veja se o que você está classificando é realmente o que você deseja classificar:
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

Depois de classificar corretamente, tudo o que eu precisava fazer era mover as instruções case para a 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

Basicamente, você teve 4 grandes problemas:
  • Sua expressão de classificação alfabética assumiu que cada linha contém números.
  • Sua expressão de classificação alfabética continha os números e o texto.
  • Sua expressão de classificação numérica tinha valores numéricos e alfabéticos.
  • Devido ao artigo 3, você não pode converter sua expressão de classificação numérica para um tipo numérico, e é por isso que você obteria uma classificação de string.

Veja este violino sql