在MySQL查询中将文本转换为数字

czu*_*zuk 122 mysql sql

是否可以在MySQL查询中将文本转换为数字?我有一个列,其标识符包含名称和格式为"name-number"的数字.该列具有VARCHAR类型.我想根据数字(具有相同名称的行)对行进行排序,但是列按照字符顺序排序,即

name-1
name-11
name-12
name-2
Run Code Online (Sandbox Code Playgroud)

如果我剪切了数字,我可以将'varchar'数字转换为'真实'数字并用它来排序行吗?我想获得以下订单.

name-1
name-2
name-11
name-12
Run Code Online (Sandbox Code Playgroud)

我无法将该数字表示为单独的列.

编辑2011-05-11 9:32

我找到了以下解决方案... ORDER BY column * 1.如果名称不包含任何数字,是否保存以使用该解决方案?

Mar*_*rco 237

这应该工作:

SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;
Run Code Online (Sandbox Code Playgroud)


mu *_*ort 31

你可以使用SUBSTRINGCONVERT:

SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);
Run Code Online (Sandbox Code Playgroud)

name_column具有"name-"值的列在哪里.在SUBSTRING移除了一切了第六个字符之前(即"名称- "前缀),然后CONVERT转换遗留到一个真正的整数.

更新:鉴于评论中的环境变化(即前缀可以是任何东西),你必须抛出一个LOCATE混合:

ORDER BY CONVERT(SUBSTRING(name_column, LOCATE('-', name_column) + 1), SIGNED INTEGER);
Run Code Online (Sandbox Code Playgroud)

这当然假设非数字前缀中没有任何连字符,但相关注释表明:

name 可以是任何字母序列

所以这应该是一个安全的假设.


Sib*_*lil 17

只需使用CAST,

CAST(column_name AS UNSIGNED)
Run Code Online (Sandbox Code Playgroud)

转换结果的类型可以是以下值之一:

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
Run Code Online (Sandbox Code Playgroud)


ver*_*ald 14

您可以使用CAST()将字符串转换为int.例如SELECT CAST('123' AS INTEGER);

  • 该版本是否具体?我需要使用`SELECT CAST('123'AS SIGNED INTEGER);`或`SELECT CAST('123'AS UNSIGNED INTEGER);`来使它工作. (12认同)

Gau*_*rav 10

SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;
Run Code Online (Sandbox Code Playgroud)


V R*_*RAO 9

一种简单的方法 SELECT '123'+ 0


Jay*_*mar 5

cast(REGEXP_REPLACE(NameNumber, '[^0-9]', '') as UNSIGNED)
Run Code Online (Sandbox Code Playgroud)

  • 正是我想要的:) (2认同)