这是我的问题。我有一张如下表:
+-----------+--------+
| 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
字段,原因我无法在此解释。
请测试你提出的任何答案。我标记为正确的答案不会成为我看到的第一个答案,除非它已经过测试并且有效。
答案 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)