问题:在emp中根据comm排序结果。但是,这个字段可以有空值。需要指定是否将控制排在最后。
解决方案:根据数据的显示方式,以及特定的rdbms排序空值的方式,可以按照升序或降序来对空值的列排序。
select ename,sal,comm from emp
order by 3
select ename,sal,comm from emp
order by 3 desc
这种解决方案中,如果可为空值的列包含非空值,那么也可以根据要求,按升序或降序排序,这可能正是所期待的,也许不是。
如果希望空值的排序与非空值不同,例如,要以升序或降序方式来排序非空值,将空值放在最后,则可使用case表达式有条件的排序列。
使用case表达式来标记一个值是否为为NULL。这个标记有两个值,一个表示NULL,一个表示非NULL。这样,只要在order by子句中增加标记列,便可以很容易的控制空值是排在前面还是最后,而不会被非空值所干扰。
select ename,sal,comm from(
select ename,sal,comm,
case when comm is null then 0 else 1 end as is_null from emp
) X
order by is_null desc,comm;