Erzwingen numerische Reihenfolge auf einer SQL Server 2005 Varchar-Spalte, mit Buchstaben und Zahlen?

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

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe eine Spalte die Saiten 'Operator (1)' enthält, und so weiter, bis 'Operator (600)' so weit.

Ich will bekommen sie numerisch geordnet, und ich habe mit

kommen
select colname from table order by 
cast(replace(replace(colname,'Operator (',''),')','') as int)

das ist sehr sehr hässlich ist.

Bessere Vorschläge?

War es hilfreich?

Lösung

Es ist so, InStr () / SubString (), Operator Ändern (1) bis Operator (001), Speichern der n in Operator (n) separat oder eine berechnete Spalte schaffen, die die hässliche Fadenmanipulation verbirgt. Was haben Sie scheint in Ordnung.

Andere Tipps

Wenn Sie wirklich Haben die Daten in dem Format, das Sie haben zu lassen - und das Hinzufügen eine numerische Reihenfolge, um Spalte ist die bessere Lösung - dann sollten Sie die Textmanipulation Einwickeln in einer benutzerdefinierten Funktion auf.

select colname aus der Tabelle, um durch dbo.udfSortOperator (colname)

Es ist weniger hässlich und gibt Ihnen eine Abstraktion. Es gibt einen zusätzlichen Aufwand der Anruffunktion, sondern auf einem Tisch mit niedrigen Tausenden von Zeilen in einem nicht allzu stark Hit-Datenbank-Server ist es kein großes Problem. Machen Sie sich Notizen in der Funktion später optomise nach Bedarf.

Meine Antwort wäre, das Problem zu ändern. Ich würde ein Operatorfeld der Tabelle hinzufügen, wenn das möglich ist. Ändern Sie die Update / Insert-Routinen, um die Zahl zu extrahieren und zu speichern. Auf diese Weise der String-Konvertierung Hit ist nur einmal pro Datensatz.

Die Ordnungslogik würde die String-Konvertierung jedes Mal, benötigt die Abfrage ausgeführt wird.

Nun, definiert zunächst die Bedeutung dieser Spalte. Ist Operator einen Namen, so dass Sie Zeichen verwenden rechtfertigen? Oder ist es eine Zahl?

Wenn das Feld ein Name ist, dann werden Sie Zeichen verwenden, und dann würden Sie die feste Länge bestimmen wollen. Pad alle Operatornamen mit Nullen auf der linken Seite. Definieren Sie Regeln für die Betreiber zu benennen (I.E. Keine leters. Oder die Codes würden Sie in einer Reihe wie „A001“ verwenden)

Ein Index wird die physikalischen Daten in dem Server sortieren. Und eine richtig Text Benennung definieren wird sie auf einer Abfrage sortieren. Sie würden beide wollen.

Wenn der Betreiber eine Zahl, dann haben Sie den Datentyp für diese Spalte falsch und muss geändert werden.

Indizierte berechnete Spalte

Wenn Sie sich finden, Bestellung oder auf andere Weise die Abfrage operator Spalte häufig, sollten Sie eine berechnete Spalte für seinen numerischen Wert zu schaffen und das Hinzufügen eines Index für sie. Dies gibt Ihnen eine berechnete / persistent Spalte (die wie Oxymoron klingt, ist aber nicht).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top