SQL订单字符串作为数字

Jam*_*mol 121 mysql sql string numbers sql-order-by

我将数字保存为VARCHARMySQL数据库.INT由于其他一些具体情况,我无法制作它们.

排序时将它们作为字符而不是数字.

在数据库中我有

1 2 3 4 5 6 7 8 9 10...
Run Code Online (Sandbox Code Playgroud)

在我的页面上,它显示如下的有序列表:

1 10 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

如何使数字按升序排列?

jue*_*n d 230

如果可能,您应该将列的数据类型更改为数字,如果您仍然只存储数字.

如果您不能这样做,那么将列值转换为integer 显式

select col from yourtable
order by cast(col as unsigned)
Run Code Online (Sandbox Code Playgroud)

隐含地,例如通过强制转换为数字的数学运算

select col from yourtable
order by col + 0
Run Code Online (Sandbox Code Playgroud)

BTW MySQL从左到右转换字符串.例子:

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 */
Run Code Online (Sandbox Code Playgroud)

  • MySQL自动将字符串转换为数字,以乘以"1" (10认同)
  • 如果你有混合字符串和数字并希望它们都排序,请使用"按col*1,col排序" (5认同)
  • 按col*1排序完美.这背后的魔力是什么?对不起,我不专业,所以这可能是一个愚蠢的问题,但如何*1改变数字? (3认同)

Vel*_*ter 61

另一种方式,不使用单一演员.

(适用于使用JPA 2.0且不允许进行转换的用户)

select col from yourtable
order by length(col),col
Run Code Online (Sandbox Code Playgroud)

编辑:仅适用于正整数

  • 这是一个很好的,它用于同时包含int和string的列 (7认同)
  • 真?"lenght"?似乎不太可能实际工作.;-) (2认同)
  • 这仅适用于正整数. (2认同)
  • 这并非在所有情况下都有效。从头顶上看,不起作用的情况是整数与的混合;负数、带前导零的数字、带分数的数字以及单词和数字的组合。 (2认同)
  • 完美的解决方案,无需任何类型的转换和杂耍,+ 1 (2认同)
  • 确实令人作呕的骇客,但它奏效了! (2认同)

Los*_*ear 16

我正在排序的列有alpha和numeric的任意组合,所以我使用这篇文章中的建议作为起点并想出了这个.

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;
Run Code Online (Sandbox Code Playgroud)

结果

ID
------------------------
106
206
1002
J206
J1002
XYZ300
XYZ1002
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 您可以简单地使用 `1 - ISNUMERIC(ID)` 而不是 `(CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END)` 将 0 更改为 1,反之亦然。 (2认同)

Par*_*nki 12

另一种简单的方法

ORDER BY ABS(column_name)


小智 8

这对我有用。

select * from tablename
order by cast(columnname as int) asc
Run Code Online (Sandbox Code Playgroud)


shu*_*van 5

另一种转换方式。

如果您有字符串字段,您可以通过以下方式转换它或其数字部分:添加前导零以使所有整数字符串具有相等的长度。

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( stringfield ) ) , stringfield ) 
Run Code Online (Sandbox Code Playgroud)

或按字段的一部分排序,例如“tensymbols13”、“tensymbols1222”等。

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) ) 
Run Code Online (Sandbox Code Playgroud)


小智 5

这将处理负数,分数,字符串,一切:

ORDER BY ISNUMERIC(col) DESC, Try_Parse(col AS decimal(10,2)), col;
Run Code Online (Sandbox Code Playgroud)