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?
Cela devrait fonctionner:
SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;
Vous pouvez utiliser SUBSTRING
et CONVERT
:
SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);
Où 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.
Vous pouvez utiliser CAST () pour convertir une chaîne en un entier. par exemple. SELECT CAST('123' AS INTEGER);
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;
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
Pour obtenir le numéro, essayez avec SUBSTRING_INDEX(field, '-', 1)
puis convertissez.
Une façon générique de faire:
SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
un moyen simple SELECT '123' + 0