SQL顺序string作为数字

我将数字保存为VARCHAR到MySQL数据库。 由于其他情况,我不能让他们成为INT

在sorting的时候把它们当作字符而不是数字。

在数据库中我有

 1 2 3 4 5 6 7 8 9 10... 

在我的页面上,它显示了这样的有序列表:

 1 10 2 3 4 5 6 7 8 9 

我怎样才能让它看起来按数字升序排列?

将您的列值显式转换为一个integer

 select col from yourtable order by cast(col as unsigned) 

或者隐含地例如用强制转换为数字的math运算

 select col from yourtable order by col + 0 

BTW MySQL将string从左到右转换。 例子:

 string value | integer value after conversion --------------+-------------------------------- '1' | 1 'ABC' | 0 /* the string does not contain a number, so the result is 0 */ '123miles' | 123 '$123' | 0 /* the left side of the string does not start with a number */ 

另一种方式,没有使用一个单一的演员。

(对于使用JPA 2.0的用户,在不允许投射的情况下)

 select col from yourtable order by length(col),col 

编辑:只适用于正整数

我正在sorting的列有字母和数字的任意组合,所以我用这篇文章中的build议作为起点,提出了这个问题。

 DECLARE @tmp TABLE (ID VARCHAR(50)); INSERT INTO @tmp VALUES ('XYZ300'); INSERT INTO @tmp VALUES ('XYZ1002'); INSERT INTO @tmp VALUES ('106'); INSERT INTO @tmp VALUES ('206'); INSERT INTO @tmp VALUES ('1002'); INSERT INTO @tmp VALUES ('J206'); INSERT INTO @tmp VALUES ('J1002'); SELECT ID, (CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) IsNum FROM @tmp ORDER BY IsNum, LEN(ID), ID; 

结果

 ID ------------------------ 106 206 1002 J206 J1002 XYZ300 XYZ1002 

希望这可以帮助

另一种转换方式。

如果你有string字段,你可以用下面的方法来转换它的数字部分:添加前导零来使所有的整数string长度相等。

 ORDER BY CONCAT( REPEAT( "0", 18 - LENGTH( stringfield ) ) , stringfield ) 

或按照“tensymbols13”,“tensymbols1222”等部分字段sorting

 ORDER BY CONCAT( REPEAT( "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) ) 

另一个简单的方法

ORDER BY ABS(column_name)

我还在寻找一个有字母前缀的sorting字段。 这是我发现的解决scheme。 这可能有助于谁在寻找相同的解决scheme。

字段值:

 FL01,FL02,FL03,FL04,FL05,...FL100,...FL123456789 select SUBSTRING(field,3,9) as field from table order by SUBSTRING(field,3,10)*1 desc 

SUBSTRING(field,3,9)我把9,因为9是足够的方法来保存最多9位整数值。

所以结果是123456789 123456788 123456787 … 100 99 … 2 1

改变你的领域是INT而不是VARCHAR。

由于其他情况,我不能让他们成为INT。

然后首先解决依赖情况。 否则,你正在解决真正的潜在问题。 使用MySQL CAST是一个选项,但是它掩盖了你应该修正的错误模式。