J'ai une base de données avec une colonne VARCHAR qui contient des entiers de longueur variable. Je veux les trier pour que 10 vienne après 9, pas 1, et 70A après 70. J'ai pu le faire avec PATINDEX () , un CTE et des instructions CASE dans la clause WHERE.
Cependant, je me demandais s'il y avait une collation où cela serait inutile.
sql-server
collation
sorting
natural-sort
Justin Dearing
la source
la source
Réponses:
Non. Le classement concerne le tri alphabétique, en fonction de la page de code, de l'accent, de la casse, de la largeur et du kana. Les chiffres (0-9) n'ont aucune de ces propriétés.
Donc ,
9
est toujours après10B
dans toute sorte.Vous devez le diviser comme vous l'avez noté
ou trier comme ceci:La longueur à droite détermine le nombre d'espaces dont vous disposez.Vous pourriez bien sûr:
justifier à droite dans un caractère (une version stockée de mon DROIT ci-dessus)Les 2 dernières suggestions sont comme mon DROIT ci-dessus et légèrement différentes. Tri plus rapide (aucun traitement du colukmn requis) mais plus de stockage requis
la source
9
c'est toujours après10B
dans n'importe quel tri. ": C'est uniquement ainsi dans SQL Server car l'option de tri sous-jacente pour gérer "DigitsAsNumbers" n'a pas été exposée en tant qu'option de classement. Encore ;-). Cela est devenu disponible pour les applications Windows à partir de Windows 7, notamment dans l'Explorateur de fichiers. Et il peut un jour être exposé à SQL Server, si suffisamment de personnes soutiennent l'idée. J'ai essayé de faire bouger les choses en déposant la suggestion Connect suivante: Prise en charge du "tri naturel" / DIGITSASNUMBERS en tant qu'option de classement .Je voudrais configurer une colonne calculée puis trier en fonction de cela. Quelque chose comme
Utilisez ensuite cette colonne pour trier, car vous pouvez maintenant indexer la colonne.
la source
Si vous voulez un moyen douloureux de prouver ce que dit @gbn (essentiellement que vous ne pouvez pas dire à un classement de commander les sous-chaînes différemment), vous pouvez créer une table #temp rapide qui a un coefficient pour l'ordre que vous attendez, et voir si la commande par n'importe quel classement renvoie le même ordre:
Cela s'exécute pour moi en environ 10 secondes et donne 0 lignes - ce qui signifie qu'aucun classement disponible pour SQL Server (au moins 2008 R2, n'a pas essayé Denali) triera de la manière que vous attendez. Vous avez besoin d'une manière différente de définir le tri.
la source
Vous voulez un moyen sensé et efficace de trier les nombres en chaînes en tant que nombres réels? Envisagez de voter pour ma suggestion Microsoft Connect: Prise en charge du "tri naturel" / DIGITSASNUMBERS comme option de classement
Bien que cette question soit spécifique à SQL Server et que cette réponse ne le soit pas, je pensais que je devrais toujours publier ces informations simplement pour en faire prendre conscience et ne pas être en opposition avec les autres réponses.
Cela dit, en dehors de SQL Server, dans certains environnements, il est possible de faire ce type de tri. C'est quelque chose qui est au moins spécifié dans la documentation Unicode. Dans la norme / le rapport UNICODE LOCALE DATA MARKUP LANGUAGE (LDML) PART 5: COLLATION , il existe un graphique pour les paramètres de classement qui décrit diverses options pour personnaliser le comportement de tri. L'une des options est
-kn-true
ou[numericOrdering on]
:Cependant, ce document est une "norme technique" et ne fait pas partie de la spécification Unicode de base. Une note en haut du document indique:
Par conséquent, ce comportement particulier n'est pas disponible dans SQL Server ou même dans .NET (du moins pas nativement), même si les deux sont conformes à la spécification Unicode de base.
Le projet ICU (International Components for Unicode) est un ensemble de bibliothèques C / C ++ et Java qui implémente cette fonctionnalité, et il y a même une démonstration en ligne de celui-ci. Et sous "projets liés", il y a un lien vers un projet .NET qui semble être un wrapper d'objet COM pour la bibliothèque ICU qui permettrait à cette fonctionnalité d'être exposée au code managé. Mais il n'est pas clair si ce projet .NET est toujours actif.
Mais pour voir ce comportement en action, accédez à la démonstration de collation ICU .
Collez ce qui suit dans la zone de texte d' entrée sur le côté gauche:
Réglez toutes les options sur "par défaut". Cochez l'option "Entrer des numéros de ligne" à droite du sortbouton et assurez-vous que l'option "Diff forces" n'est pas cochée.
Cliquez sur le sortbouton et vous devriez récupérer ce qui suit:
C'est ce à quoi vous devez vous attendre lors d'un tri de chaîne typique et ce que vous voyez dans SQL Server.
Maintenant, dans la série de boutons radio juste au-dessus du sortbouton, la deuxième ligne est étiquetée "numérique". Sélectionnez le bouton radio "on".
Cliquez sortà nouveau sur le bouton et vous devriez récupérer ce qui suit:
Vous vous demandez si cela fonctionne lorsque la partie numérique est au milieu de la chaîne? Ok, collez ce qui suit dans la zone de texte d' entrée sur le côté gauche (en remplaçant la liste précédente):
Assurez-vous que le paramètre numérique est toujours défini sur "on". Cliquez sortà nouveau sur le bouton et vous devriez récupérer ce qui suit:
Vous voulez voir ça ailleurs? Créez un dossier sur votre disque dur, quelque chose comme C: \ temp \ sorting \ , et créez des fichiers vides de ces mêmes noms "Script -...". Faites un
DIR
dans une fenêtre de commande et vous verrez le tri standard. Mais lorsque vous regardez la liste des fichiers dans l'Explorateur Windows, vous verrez la liste triée en utilisant l'option "numérique" :-).la source