139 votos

Convertir un texto en un número en una consulta MySQL

¿Es posible convertir un texto en un número dentro de una consulta MySQL? Tengo una columna con un identificador que consiste en un nombre y un número en el formato de "nombre-número". La columna es de 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 número 'real' y utilizarlo para ordenar las filas? Me gustaría obtener el siguiente orden.

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

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

editado 2011-05-11 9:32

He encontrado la siguiente solución ... ORDER BY column * 1 . Si el nombre no contiene ningún número, ¿se puede utilizar esta solución?

258voto

Marco Puntos 29879

Esto debería funcionar:

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

33voto

mu is too short Puntos 205090

Puede utilizar SUBSTRING y CONVERT :

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

Dónde name_column es la columna con los valores "nombre". La dirección SUBSTRING elimina todo lo que hay antes del sexto carácter (es decir, el prefijo "nombre") y luego el CONVERT convierte el resto en un entero real.

ACTUALIZACIÓN : 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);

Por supuesto, esto supone que el prefijo no numérico no tiene ningún guión, pero el comentario correspondiente lo dice:

name puede ser cualquier secuencia de letras

así que debería ser una suposición segura.

14voto

verdesmarald Puntos 6632

Puede utilizar CAST() para convertir de string a int. Por ejemplo SELECT CAST('123' AS INTEGER);

10voto

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

2voto

Harsha Puntos 862

si su clave primaria es una cadena con un formato como

ABC/EFG/EE/13/123(número de secuencia)
este tipo de cadena se puede utilizar 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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X