texto - signed mysql
Convierte texto en nĂºmero en consulta MySQL (9)
¿Es posible convertir texto en número dentro de la 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 tiene el tipo VARCHAR. Quiero ordenar las filas según el número (filas con el mismo nombre) pero la columna se ordena de acuerdo con el orden de los caracteres, es decir,
name-1
name-11
name-12
name-2
Si selecciono el número, ¿puedo convertir el número ''varchar'' en el número ''real'' y usarlo 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
Encontré la siguiente solución ... ORDER BY column * 1
. Si el nombre no contiene ningún número, ¿es seguro usar esa solución?
Esto debería funcionar:
SELECT field,CONVERT(SUBSTRING_INDEX(field,''-'',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;
Para obtener el número, intente con SUBSTRING_INDEX(field, ''-'', 1)
luego convierta.
Puede usar CAST() para convertir de cadena a int. por ejemplo, SELECT CAST(''123'' AS INTEGER);
Puede usar 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 "nombre-") y luego el CONVERT
convierte el valor restante en un número 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 guiones, pero el comentario relevante dice que:
name
puede ser cualquier secuencia de letras
entonces eso debería ser una suposición segura.
Simplemente use CAST,
CAST(column_name AS UNSIGNED)
El tipo para el resultado del lanzamiento puede ser uno de los siguientes valores:
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
Una forma genérica de hacer:
SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
si su clave principal es una cadena en un formato como
ABC / EFG / EE / 13/123 (número de secuencia)
este tipo de cuerda se puede usar fácilmente para clasificar con el delimitador ("/")
podemos usar la siguiente consulta para pedir 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
una forma simple SELECCIONE ''123'' + 0
SELECT *, CAST(SUBSTRING_INDEX(field, ''-'', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;