MySQL Varchar排序为Int

时间:2015-12-30 14:51:07

标签: mysql

这是我的问题。我有一张如下表:

+-----------+--------+
| data      | number | 
+-----------+--------+
| Something | NULL   |
| Test      | 1      |
| Another   | 5      |
| Testy     | 22     |
| Tester    | NULL   |
| Test2     | 3      |
+-----------+--------+

Number字段的类型为VARCHAR,我需要按此列排序。我无法覆盖CAST,因为我需要保留NULL值;我不想将它们变成0

以下是我迄今为止所做的尝试:

IF ( number != NULL, CAST( number AS UNSIGNED ), number ) as int_number

+

ORDER BY int_number

但这不起作用,我认为因为CAST只能影响一个整体的列,而不是个别的每个值。

我无法将此列转换为INT字段,原因我无法在此解释。

请测试你提出的任何答案。我标记为正确的答案不会成为我看到的第一个答案,除非它已经过测试并且有效。

3 个答案:

答案 0 :(得分:1)

CAST()和CONVERT()函数不会将空值转换为0,您需要使用IFNULL()或COALESCE()。因此,您可以执行order by cast(fieldname as signed integer)以保持空值不变。

答案 1 :(得分:1)

  

NULL应出现在所有数字

之前

实现它的一个简单方法就是使用CAST

SELECT * FROM tab ORDER BY CAST(number AS UNSIGNED)

SqlFiddleDemo

输出:

╔════════════╦════════╗
║   data     ║ number ║
╠════════════╬════════╣
║ Something  ║ (null) ║
║ Tester     ║ (null) ║
║ Test       ║ 1      ║
║ Test2      ║ 3      ║
║ Another    ║ 5      ║
║ Testy      ║ 22     ║
╚════════════╩════════╝

如果可能,您应该考虑将数据类型更改为INT

<小时/> 另一种方法是使用注释中提出的Abhik Chakraborty隐式转换:

SELECT * FROM tab ORDER BY number + 0

答案 2 :(得分:1)

使用此

IF ( number  IS NOT NULL, CAST( number AS UNSIGNED ), NULL ) AS int_number

注意:

NULL值不能与大多数比较运算符一起使用。例如,=,&gt;,&gt; =,&lt; =,&lt;,或!=不能使用,因为与NULL的任何比较总是返回NULL值,永远不会为true(1)或false(0)