148 votes

Convertir du texte en nombre dans une requête MySQL

Est-il possible de convertir un texte en un nombre dans une requête MySQL ? J'ai une colonne dont l'identifiant se compose d'un nom et d'un nombre au format "nom-nombre". La colonne est de type VARCHAR. Je veux trier les lignes en fonction du nombre (lignes avec le même nom) mais la colonne est triée selon l'ordre des caractères, c'est-à-dire

name-1
name-11
name-12
name-2

Si je coupe le nombre, puis-je convertir le nombre 'varchar' en nombre 'réel' et l'utiliser pour trier les lignes ? Je voudrais obtenir l'ordre suivant.

name-1
name-2
name-11
name-12

Je ne peux pas représenter le nombre comme une colonne séparée.

édité le 2011-05-11 9:32

J'ai trouvé la solution suivante ... ORDER BY column * 1 . Si le nom ne contient pas de chiffres, peut-on utiliser cette solution en toute sécurité ?

1 votes

nom est exactement nom ou cela peut être n'importe quel caractère ? Je veux dire : est-ce une chaîne de quatre caractères ou un vrai nom ?

0 votes

name peut être n'importe quelle séquence de lettres.

1 votes

duplicata possible de mysql tri naturel

276voto

Marco Points 29879

Cela devrait fonctionner :

SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;

1 votes

Pourriez-vous ajouter une explication et un lien vers la documentation ?

0 votes

Ma chaîne est du type "nom-abc12". En ajoutant votre code, cela ne fonctionne que si les caractères initiaux après "-" ne commencent pas par une lettre. @Marco Pouvez-vous me dire comment ignorer les lettres sans condition de type "where" ?

1 votes

@Eduardo ma requête est censée récupérer la chaîne après le "-" et la convertir en un nombre (ce doit être un nombre). Dans votre cas, je continuerais à utiliser une expression régulière probablement...

35voto

mu is too short Points 205090

Vous pouvez utiliser SUBSTRING et CONVERT :

SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);

name_column est la colonne contenant les valeurs "nom-". Le site SUBSTRING supprime tout ce qui se trouve avant le sixième caractère (c'est-à-dire le préfixe "nom-"), puis la balise CONVERT convertit le reste en un nombre entier réel.

UPDATE : Étant donné les circonstances changeantes dans les commentaires (c'est-à-dire que le préfixe peut être n'importe quoi), vous devrez lancer un LOCATE dans le mélange :

ORDER BY CONVERT(SUBSTRING(name_column, LOCATE('-', name_column) + 1), SIGNED INTEGER);

Cela suppose bien sûr que le préfixe non numérique ne comporte pas de trait d'union, mais c'est ce que dit le commentaire correspondant :

name peut être n'importe quelle séquence de lettres

donc ça devrait être une supposition sûre.

0 votes

En réponse à mon commentaire, il nous a dit nom peut être n'importe quelle séquence de caractères, donc je ne suis pas sûr que vous puissiez utiliser SUBSTRING(name_column, 6) . Je sais, tu l'as posté quand il ne nous a pas dit ça...

0 votes

@Marco : Merci pour l'info, j'ai ajouté une mise à jour qui devrait prendre en charge les nouvelles informations sur les préfixes. Mais oui, votre SUBSTRING_INDEX est plus agréable.

28voto

Il suffit d'utiliser CAST,

CAST(column_name AS UNSIGNED)

Le type du résultat du moulage peut être l'une des valeurs suivantes :

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]

15voto

verdesmarald Points 6632

Vous pouvez utiliser CAST() pour convertir une chaîne de caractères en un nombre entier, par exemple SELECT CAST('123' AS INTEGER);

19 votes

Est-ce une version spécifique ? J'ai besoin d'utiliser SELECT CAST('123' AS SIGNED INTEGER); ou SELECT CAST('123' AS UNSIGNED INTEGER); pour le faire fonctionner.

10voto

Gaurav Points 14339
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;

1 votes

Êtes-vous sûr que le ORDER BY utilise num comme un nombre sans utiliser CONVERT ? Je n'en suis pas sûr, mais ça peut être Je me demande simplement :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X