# 2.4 对字母数字混合的数据排序

问题：

排序依据的列中有null，把该列的值为null的行放在最后

例如：按照EMP表的COMM列对查询结果进行排序，但该字段可能为null，非null值以升序排列或降序排列，把全部的null值都放在最后面

解决方案：

使用case表达式来动态调整排序项

```
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
```

结果如下：

![](https://3748388522-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MRjpdT6PYM3zgtBC3PD%2F-Me2kfCXkj1RsYB--cwV%2F-Me3-prUiI0hVte4hWHD%2Fimage.png?alt=media\&token=06e63a17-e6ea-43ed-9518-05e35deaac33)

这里子查询表x，是临时的，其中is\_null就是一个辅助列，按照这个列来排序

```
select ename,sal,comm,
	case when comm is null then 0
	else 1
	end as is_null
from emp
```

结果如下：

![](https://3748388522-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MRjpdT6PYM3zgtBC3PD%2F-Me2kfCXkj1RsYB--cwV%2F-Me30munIkmBombl1slX%2Fimage.png?alt=media\&token=f576b6c2-7a46-4d94-b8bb-8a1e2f66b844)

【注意】

此例在 FROM 子句里用到了内嵌视图（即子查询）。

> ANSI SQL 标准规定要给它们取别名。 （只有 Oracle 不要求指定这一类别名。）因此，我在解决方案里经常用类似 X 和 Y 这样的别 名来标识内嵌视图。 注意最后紧挨着圆括号的字母 X 。 在这里，字母 X 变成了 FROM 子句里那个子查询返回的表的名字。 列别名是一个有用的工具，能帮我们写出自注释的代码； 相对而言，（本书中出现过的多数）内嵌视图的别名只是一种形式化的东西。 通常我会为它们取一个简单的名字，诸如 X 、 Y 、 Z 、 TMP1 和 TMP2 。
