Forcer la commande numérique sur une colonne SQL Server 2005 varchar contenant des lettres et des chiffres?

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

  •  09-06-2019
  •  | 
  •  

Question

J'ai une colonne contenant les chaînes "Opérateur (1)" et ainsi de suite jusqu'à "Opérateur (600)" jusqu'à présent.

Je veux les obtenir classés par ordre numérique et je suis venu avec

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

qui est très très moche.

De meilleures suggestions?

Était-ce utile?

La solution

C’est cela, InStr () / SubString (), changeant Opérateur (1) en Opérateur (001), stockant le n dans Operator (n) séparément, ou créant une colonne calculée masquant la manipulation de chaîne laide. Ce que tu as semble bien.

Autres conseils

Si vous devez réellement laisser les données dans le format que vous avez choisi (et l'ajout d'une colonne d'ordre de tri numérique est la meilleure solution), envisagez de regrouper la manipulation de texte dans une fonction définie par l'utilisateur.

sélectionnez nom_colonne dans l'ordre des tables à l'aide de dbo.udfSortOperator (nom_colonne)

C’est moins moche et vous donne de l’abstraction. Il y a une surcharge supplémentaire de l'appel de fonction, mais sur une table contenant des milliers de lignes faibles dans un serveur de base de données peu sollicité, ce n'est pas une préoccupation majeure. Prenez des notes dans la fonction afin d’optomiser plus tard, au besoin.

Ma réponse serait de changer le problème. J'ajouterais un champ operatorNumber à la table si cela est possible. Modifiez les routines de mise à jour / insertion pour extraire le numéro et le stocker. De cette façon, la conversion de chaîne ne reçoit qu’une fois par enregistrement.

La logique de commande nécessiterait la conversion de chaîne à chaque exécution de la requête.

Eh bien, définissez d’abord le sens de cette colonne. Est-ce que l'opérateur est un nom pour que vous puissiez justifier l'utilisation de caractères? Ou est-ce un numéro?

Si le champ est un nom, vous utiliserez des caractères, puis vous voudrez déterminer la longueur fixe. Tapez tous les noms d'opérateurs avec des zéros à gauche. Définissez des règles de dénomination pour les opérateurs (I.E. No leters. Ou les codes que vous utiliseriez dans une série du type "A001")

Un index va trier les données physiques sur le serveur. Et un nom de texte correctement défini les triera sur une requête. Vous voudriez les deux.

Si l'opérateur est un nombre, le type de données de cette colonne est incorrect et doit être modifié.

Colonne calculée indexée

Si vous vous trouvez souvent en train de commander ou d'interroger la colonne de l'opérateur , envisagez de créer une colonne calculée pour sa valeur numérique et d'ajouter un index pour celle-ci. Cela vous donnera une colonne calculée / persistante (qui ressemble à un oxymore, mais ne l’est pas).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top