Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Ordinamento alfanumerico

Ecco un suggerimento:ogni volta che hai problemi con l'ordinamento, aggiungi l'ordine per articoli alla tua clausola select. questo ti consentirà di vedere se ciò che stai ordinando è effettivamente ciò che desideri ordinare:

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

Dopo aver ottenuto l'ordinamento correttamente, tutto ciò che dovevo fare è spostare le istruzioni del caso nell'ordine per clausola:

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

Fondamentalmente, hai avuto 4 problemi principali:

  • La tua espressione di ordinamento alfabetico presuppone che ogni riga contenga numeri.
  • La tua espressione di ordinamento alfabetico conteneva sia i numeri che il testo.
  • La tua espressione di ordinamento numerico aveva valori sia numerici che alfabetici.
  • A causa dell'articolo 3, non è possibile eseguire il cast dell'espressione di ordinamento numerico in un tipo numerico, ed è per questo che si dovrebbe ottenere un ordinamento di stringhe.

Guarda questo violino sql