Tri des colonnes de chaînes avec des nombres intégrés dans SQL
Le tri des colonnes de chaînes contenant des nombres dans SQL peut présenter des défis. L'algorithme de tri naturel de nombreuses bases de données place les nombres dans le mauvais ordre, par exemple en plaçant « un 12 » après « un 1 ». Ce comportement est acceptable pour la plupart des applications, mais il peut s'avérer indésirable pour des besoins spécifiques.
Est-il possible de trier des colonnes de chaînes avec des nombres incorporés en utilisant du SQL pur ?
SOLUTION
En supposant que la colonne suit un modèle spécifique de « NUMÉRO d'espace MOT », l'extrait de code suivant peut être utilisé pour trier la colonne correctement :
SELECT * FROM table ORDER BY CAST(SUBSTRING(column,LOCATE(' ',column)+1) AS SIGNED)
Voici comment cela fonctionne :
PRUVE DE CONCEPT
Les exemples suivants illustrent le comportement de tri :
mysql> INSERT INTO t (st) VALUES ('a 1'),('a 12'),('a 6'),('a 11'); mysql> SELECT * FROM t ORDER BY st; mysql> SELECT * FROM t ORDER BY CAST(SUBSTRING(st,LOCATE(' ',st)+1) AS SIGNED);
La deuxième requête trie les résultats correctement, en plaçant "un 1" avant "un 12".
CONSIDERATIONS
Si le modèle de colonne diffère de "WORD space NUMBER", une solution de contournement différente peut être nécessaire.
AMÉLIORATIONS
La requête améliorée suivante ajoute un double tri pour séparer les préfixes de lettres avec des valeurs numériques :
ORDER BY SUBSTRING_INDEX(st, " ", 1) ASC, CAST(SUBSTRING_INDEX(st, " ", -1) AS SIGNED)
Cet extrait de code modifié fournit une solution de tri plus complète.
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!