web-dev-qa-db-fra.com

Convertir un texte en nombre dans une requête MySQL

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

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

Si je coupe du nombre, puis-je convertir le nombre 'varchar' en un 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 sous forme de colonne séparée.

modifié le 11/05/2011 9:32

J'ai trouvé la solution suivante ... ORDER BY column * 1. Si le nom ne contient aucun chiffre, est-il possible d'utiliser cette solution?

108
czuk

Cela devrait fonctionner:

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

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 avec les valeurs "name-". La SUBSTRING supprime tout ce qui se trouve avant le sixième caractère (c'est-à-dire le préfixe "nom-"), puis la CONVERT convertit le reste sur un entier entier.

UPDATE: Compte tenu de l'évolution des circonstances dans les commentaires (le préfixe peut être n'importe quoi), vous devrez ajouter LOCATE dans le mix:

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

Bien entendu, cela suppose que le préfixe non numérique ne comporte pas de tiret, mais le commentaire pertinent dit que:

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

donc cela devrait être une hypothèse sûre.

26
mu is too short

Vous pouvez utiliser CAST () pour convertir une chaîne en un entier. par exemple. SELECT CAST('123' AS INTEGER);

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

Utilisez simplement CAST,

CAST(column_name AS UNSIGNED)

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

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

si votre clé primaire est une chaîne dans un format tel que

ABC/EFG/EE/13/123 (numéro de séquence)
ce type de chaîne peut facilement être utilisé pour trier avec le délimiteur ("/")

nous pouvons utiliser la requête suivante pour commander une table avec ce type de clé

SELECT * FROM `TABLE_NAME` ORDER BY 
CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC
2
Harsha

Pour obtenir le numéro, essayez avec SUBSTRING_INDEX(field, '-', 1) puis convertissez.

2
user744116

Une façon générique de faire:

SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
0
Azzu

un moyen simple SELECT '123' + 0

0
V R K RAO