Tri des colonnes de chaînes contenant des nombres dans SQL
Lors du tri des colonnes de chaînes contenant des nombres, l'algorithme de tri MySQL par défaut place les nombres après les lettres. Ce n'est pas toujours le comportement souhaité.
Problème :
Trier la colonne de chaîne suivante contenant des nombres par ordre croissant :
name |
---|
a 1 |
a 12 |
a 2 |
a 3 |
Le attendu le résultat est :
name |
---|
a 1 |
a 2 |
a 3 |
a 12 |
Solution avec SQL :
En supposant que le modèle de colonne est toujours « NUMÉRO d'espace MOT », la requête SQL suivante peut être utilisée :
<code class="sql">SELECT * FROM table ORDER BY CAST(SUBSTRING(column, LOCATE(' ', column) + 1) AS SIGNED);</code>
Alternativement, avec SUBSTRING_INDEX :
<code class="sql">ORDER BY SUBSTRING_INDEX(column, " ", 1) ASC, CAST(SUBSTRING_INDEX(column, " ", -1) AS SIGNED);</code>
Cette requête utilise SUBSTRING_INDEX pour extraire séparément les parties de mots et de chiffres de la chaîne et les trie en conséquence.
Explication :
Cette solution repose sur le fait que la sous-chaîne après le caractère espace dans la chaîne contient toujours le nombre. En convertissant cette sous-chaîne en valeur numérique, nous pouvons trier la colonne numériquement, en ignorant le préfixe de la lettre.
Remarque :
Si la colonne de chaîne ne suit pas le " "WORD space NUMBER", des fonctions de logique ou de manipulation de chaîne supplémentaires peuvent être nécessaires pour obtenir le résultat de tri souhaité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!