Convertir texto en número en la consulta MySQL


¿Es posible convertir texto en número dentro de MySQL query? Tengo una columna con un identificador que consiste en un nombre y un número en el formato de "nombre-número". La columna tiene el tipo VARCHAR. Quiero ordenar las filas según el número (filas con el mismo nombre), pero la columna se ordena según el orden de los caracteres, es decir,

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

Si corto el número, ¿puedo convertir el número 'varchar' en el número 'real' y usarlo para ordenar las filas? Me gustaría obtener los siguientes orden.

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

No puedo representar el número como una columna separada.

Edited 2011-05-11 9:32

He encontrado la siguiente solución ... ORDER BY column * 1. Si el nombre no va a contener ningún número es guardar para utilizar esa solución?

 98
Author: czuk, 2011-05-11

9 answers

Esto debería funcionar:

SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;
 198
Author: Marco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-05 10:25:22

Puede utilizar SUBSTRING y CONVERT:

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

Donde name_column es la columna con los valores "name -". El SUBSTRING elimina todo antes del sexto carácter (es decir, el prefijo "name -") y luego el CONVERT convierte el sobrante en un entero real.

UPDATE: Dadas las circunstancias cambiantes en los comentarios (es decir, el prefijo puede ser cualquier cosa), tendrás que lanzar un LOCATE en la mezcla:

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

Esto, por supuesto, supone que la el prefijo no numérico no tiene guiones, pero el comentario relevante dice que:

name puede ser cualquier secuencia de letras

Así que eso debería ser una suposición segura.

 25
Author: mu is too short,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 07:51:51

Puedes usar CAST() para convertir de string a int. por ejemplo, SELECT CAST('123' AS INTEGER);

 11
Author: verdesmarald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 07:25:59
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;
 10
Author: Gaurav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 07:38:04

Simplemente use CAST,

CAST(column_name AS UNSIGNED)

El tipo para el resultado fundido puede ser uno de los siguientes valores:

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
 6
Author: Sibin John Mattappallil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-16 05:23:17

Para obtener el número, intente con SUBSTRING_INDEX(field, '-', 1) y luego convierta.

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 07:26:36

Si su clave principal es una cadena en un formato como

ABC/EFG/EE/13/123(número secuencial)
este tipo de cadena se puede usar fácilmente para ordenar con el delimitador (" / " )

Podemos utilizar la siguiente consulta para ordenar una tabla con este tipo de clave

SELECT * FROM `TABLE_NAME` ORDER BY 
CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC
 2
Author: Harsha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-15 11:25:23

Una manera simple SELECCIONE '123' + 0

 0
Author: V R K RAO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-04 10:43:12

Una forma genérica de hacerlo :

SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
 0
Author: Azzu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 14:46:33