Forzare l'ordine numerico su una colonna varchar di SQL Server 2005, contenente lettere e numeri?

StackOverflow https://stackoverflow.com/questions/75361

  •  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?

È stato utile?

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 è).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top