是否可以在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
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)
Gau*_*rav 10
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;
Run Code Online (Sandbox Code Playgroud)
cast(REGEXP_REPLACE(NameNumber, '[^0-9]', '') as UNSIGNED)
Run Code Online (Sandbox Code Playgroud)