Forzare l'ordine numerico su una colonna varchar di SQL Server 2005, contenente lettere e numeri?
-
09-06-2019 - |
Domanda
Ho una colonna contenente le stringhe "Operatore (1)" e così via fino a "Operatore (600)" finora.
Voglio ordinarli numericamente e mi è venuta in mente
select colname from table order by
cast(replace(replace(colname,'Operator (',''),')','') as int)
il che è molto, molto brutto.
Suggerimenti migliori?
Soluzione
È così, InStr()/SubString(), cambiando Operator(1) in Operator(001), memorizzando la n in Operator(n) separatamente o creando una colonna calcolata che nasconde la brutta manipolazione delle stringhe.Quello che hai sembra a posto.
Altri suggerimenti
Se davvero Avere per lasciare i dati nel formato che hai - e aggiungere una colonna di ordinamento numerico è la soluzione migliore - quindi considera di racchiudere la manipolazione del testo in una funzione definita dall'utente.
seleziona colname dall'ordine della tabella con dbo.udfSortOperator(colname)
È meno brutto e ti dà un po' di astrazione.C'è un ulteriore sovraccarico della chiamata di funzione, ma su una tabella contenente poche migliaia di righe in un server di database non troppo colpito non è un grosso problema.Prendi appunti nella funzione per ottimizzare in seguito come richiesto.
La mia risposta sarebbe cambiare il problema.Se possibile, aggiungerei un campo operatorNumber alla tabella.Modificare le routine di aggiornamento/inserimento per estrarre il numero e memorizzarlo.In questo modo l'hit di conversione della stringa è solo una volta per record.
La logica dell'ordinamento richiederebbe la conversione della stringa ogni volta che viene eseguita la query.
Bene, prima definisci il significato di quella colonna.L'operatore è un nome in modo da poter giustificare l'uso dei caratteri?Oppure è un numero?
Se il campo è un nome, utilizzerai i caratteri e quindi vorrai determinare la lunghezza fissa.Completa tutti i nomi degli operatori con zeri a sinistra.Definire le regole di denominazione per gli operatori (I.E.Nessuna lettera.Oppure i codici che utilizzeresti in una serie come "A001")
Un indice ordinerà i dati fisici nel server.E una denominazione di testo definita correttamente li ordinerà in una query.Li vorresti entrambi.
Se l'operatore è un numero, hai sbagliato il tipo di dati per quella colonna e deve essere modificato.
Colonna calcolata indicizzata
Se ti ritrovi a ordinare o a fare domande in altro modo operator
colonna spesso, prendi in considerazione la creazione di una colonna calcolata per il suo valore numerico e l'aggiunta di un indice per essa.Questo ti darà una colonna calcolata/persistente (che suona come un ossimoro, ma non lo è).