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是一个选项,但是它掩盖了你应该修正的错误模式。