Maison >base de données >tutoriel mysql >Comment puis-je trier les colonnes de chaînes avec des nombres intégrés dans SQL ?

Comment puis-je trier les colonnes de chaînes avec des nombres intégrés dans SQL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-25 04:13:30814parcourir

How Can I Sort String Columns with Embedded Numbers in SQL?

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 :

  • LOCATE(' ',column) trouve la position du caractère espace dans la chaîne.
  • SUBSTRING(column,LOCATE(' ',column) 1) extrait la partie numérique de la chaîne après l'espace.
  • CAST(... AS SIGNED) convertit le nombre extrait en un entier signé pour comparaison.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn