Desideri un mezzo ragionevole ed efficiente per ordinare i numeri nelle stringhe come numeri reali? Prendi in considerazione la possibilità di votare il mio suggerimento per Microsoft Connect: supporta "ordinamento naturale" / DIGITSASNUMBERS come opzione di confronto
Mentre questa domanda è specifica per SQL Server e questa risposta non lo è, ho sentito che avrei dovuto pubblicare queste informazioni semplicemente per sensibilizzarle e non essere in contrasto con nessuna delle altre risposte.
Detto questo, al di fuori di SQL Server, in alcuni ambienti è possibile eseguire questo tipo di ordinamento. È qualcosa che è almeno specificato nella documentazione Unicode. Nella LINGUA DI MARCHIO DEI DATI DI UNICODE LOCALE (LDML) PARTE 5: standard / report di COLLEZIONE , esiste un grafico per le impostazioni di confronto che descrive varie opzioni per personalizzare il comportamento di ordinamento. Una delle opzioni è -kn-true
o [numericOrdering on]
:
Se impostato su on , qualsiasi sequenza di cifre decimali (General_Category = Nd in [ UAX44 ]) viene ordinata a un livello primario con il suo valore numerico. Ad esempio, "A-21" <"A-123". I pesi primari calcolati sono tutti all'inizio del gruppo di riordino delle cifre . Pertanto, con una tabella UCA non personalizzata, "a $" <"a0" <"a2" <"a12" <"a⓪" <"aa".
Tuttavia, questo documento è uno "standard tecnico" e non fa parte delle specifiche Unicode di base. Una nota nella parte superiore del documento afferma:
Uno standard tecnico Unicode (UTS) è una specifica indipendente. La conformità allo standard Unicode non implica la conformità a nessun UTS.
Pertanto, questo comportamento particolare non è disponibile in SQL Server o anche in .NET (almeno non in modo nativo), sebbene entrambi siano conformi alle specifiche Unicode di base.
Il progetto ICU (International Components for Unicode) è un insieme di librerie C / C ++ e Java che implementa questa funzionalità e ne esiste persino una demo online. E in "progetti correlati" esiste un collegamento a un progetto .NET che sembra essere un wrapper di oggetti COM per la libreria ICU che consentirebbe a questa funzionalità di essere esposta al codice gestito. Ma non è chiaro se quel progetto .NET sia ancora attivo.
Ma per vedere questo comportamento in azione, vai alla Demo Collation ICU .
Incolla quanto segue nell'area di testo di input sul lato sinistro:
1
2
10B
6
11
10A
3
10
Impostare tutte le opzioni su "predefinito". Seleziona l'opzione "immetti numeri di riga" a destra del sortpulsante e assicurati che l'opzione "punti di forza diff" sia deselezionata.
Fai clic sul sortpulsante e dovresti recuperare quanto segue:
[1] 1
[8] 10
[6] 10A
[3] 10B
[5] 11
[2] 2
[7] 3
[4] 6
Questo è ciò che dovrebbe essere previsto quando si esegue un ordinamento di stringhe tipico e ciò che viene visualizzato in SQL Server.
Ora, nella serie di pulsanti di opzione appena sopra il sortpulsante, la seconda riga è etichettata "numerica". Seleziona il pulsante di opzione "on".
Fai di sortnuovo clic sul pulsante e dovresti recuperare quanto segue:
[1] 1
[2] 2
[7] 3
[4] 6
[8] 10
[6] 10A
[3] 10B
[5] 11
In dubbio se questo funziona quando la parte numerica si trova al centro della stringa? Ok, incolla quanto segue nell'area di testo di input sul lato sinistro (sostituendo l'elenco precedente):
Script - 1.sql
Script - 2.sql
Script - 10B.sql
Script - 6.sql
Script - 11.sql
Script - 10A.sql
Script - 3.sql
Script - 10.sql
Assicurarsi che l' impostazione numerica sia ancora impostata su "on". Fai di sortnuovo clic sul pulsante e dovresti recuperare quanto segue:
[1] Script - 1.sql
[2] Script - 2.sql
[7] Script - 3.sql
[4] Script - 6.sql
[8] Script - 10.sql
[6] Script - 10A.sql
[3] Script - 10B.sql
[5] Script - 11.sql
Vuoi vederlo in un altro posto? Crea una cartella sul tuo hard disk, qualcosa come C: \ temp \ sorting \ , e crea file vuoti con gli stessi nomi "Script -...". Esegui un DIR
comando in una finestra di comando e vedrai l'ordinamento standard. Ma quando guardi la lista dei file in Windows Explorer vedrai la lista ordinata usando l'opzione "numerica" :-).