各种数据库产品数据按某字段Order by时null的位置问题
2011-06-15 09:02
344 查看
oracle、mssql、mysql三种数据库产品在order by时:
Oracle在Order by时缺省认为null是最大值,所以如果是ASC升序则排在最后,DESC降序则排在最前面;
mssql和mysql在order by时缺省认为null是最小值,所以如果是ASC升序则排在最前面,DESC降序则排在最后;
对任意的数据库产品,想要在按某字段排序时(不管是升序还是降序),对字段值为null的记录的出现顺序做任意的安排,可以使用以下的通用做法:
ORDER BY CASE WHEN Col Is NULL Then 1/0 Else 0/1 End,Col [asc/desc]
Example 1:
oracle order by ,按Col升序,但是Col为null的排最前:
Sql代码
ORDER BY CASE WHEN Col Is NULL Then 0 Else 1 End, Col
Example 2:
mssql/mysql order by,按Col升序,但是Col为null的排最后:
Sql代码
ORDER BY CASE WHEN Col Is NULL Then 1 Else 0 End, Col
参见:
http://sqlblog.com/blogs/denis_gobo/archive/2007/10/19/3048.aspx
引用
Sort Values Ascending But NULLS Last
This is a frequent request in newsgroups and fora. People want to sort the column in ascending order but don't want the NULLS at the beginning.
Oracle has this syntax: ORDER BY ColumnName NULLS LAST;
SQL Server does not have this. But there are 2 ways to do this. The first one is by using case and the second one by using COALESCE and the maximum value for the data type in the order by clause.
The 2 approaches with a datetime data type
DECLARE @Temp table(Col datetime)
INSERT INTO @Temp VALUES(getdate())
INSERT INTO @Temp VALUES('2007-10-19 09:54:03.730')
INSERT INTO @Temp VALUES('2006-10-19 09:54:03.730')
INSERT INTO @Temp VALUES('2005-10-19 09:54:03.730')
INSERT INTO @Temp VALUES('2006-10-19 09:54:03.730')
INSERT INTO @Temp VALUES('2004-10-19 09:54:03.730')
INSERT INTO @Temp VALUES(NULL)
INSERT INTO @Temp VALUES(NULL)
SELECT *
FROM @Temp
ORDER BY COALESCE(Col,'9999-12-31 23:59:59.997')
SELECT *
FROM @Temp
ORDER BY CASE WHEN Col Is NULL Then 1 Else 0 End, Col
The 2 approaches with an integer data type
DECLARE @Temp table(Col int)
INSERT INTO @Temp VALUES(1)
INSERT INTO @Temp VALUES(555)
INSERT INTO @Temp VALUES(444)
INSERT INTO @Temp VALUES(333)
INSERT INTO @Temp VALUES(5656565)
INSERT INTO @Temp VALUES(3)
INSERT INTO @Temp VALUES(NULL)
INSERT INTO @Temp VALUES(NULL)
SELECT *
FROM @Temp
ORDER BY COALESCE(Col,'2147483647')
SELECT *
FROM @Temp
ORDER BY CASE WHEN Col Is NULL Then 1 Else 0 End, Col
Oracle在Order by时缺省认为null是最大值,所以如果是ASC升序则排在最后,DESC降序则排在最前面;
mssql和mysql在order by时缺省认为null是最小值,所以如果是ASC升序则排在最前面,DESC降序则排在最后;
对任意的数据库产品,想要在按某字段排序时(不管是升序还是降序),对字段值为null的记录的出现顺序做任意的安排,可以使用以下的通用做法:
ORDER BY CASE WHEN Col Is NULL Then 1/0 Else 0/1 End,Col [asc/desc]
Example 1:
oracle order by ,按Col升序,但是Col为null的排最前:
Sql代码
ORDER BY CASE WHEN Col Is NULL Then 0 Else 1 End, Col
Example 2:
mssql/mysql order by,按Col升序,但是Col为null的排最后:
Sql代码
ORDER BY CASE WHEN Col Is NULL Then 1 Else 0 End, Col
参见:
http://sqlblog.com/blogs/denis_gobo/archive/2007/10/19/3048.aspx
引用
Sort Values Ascending But NULLS Last
This is a frequent request in newsgroups and fora. People want to sort the column in ascending order but don't want the NULLS at the beginning.
Oracle has this syntax: ORDER BY ColumnName NULLS LAST;
SQL Server does not have this. But there are 2 ways to do this. The first one is by using case and the second one by using COALESCE and the maximum value for the data type in the order by clause.
The 2 approaches with a datetime data type
DECLARE @Temp table(Col datetime)
INSERT INTO @Temp VALUES(getdate())
INSERT INTO @Temp VALUES('2007-10-19 09:54:03.730')
INSERT INTO @Temp VALUES('2006-10-19 09:54:03.730')
INSERT INTO @Temp VALUES('2005-10-19 09:54:03.730')
INSERT INTO @Temp VALUES('2006-10-19 09:54:03.730')
INSERT INTO @Temp VALUES('2004-10-19 09:54:03.730')
INSERT INTO @Temp VALUES(NULL)
INSERT INTO @Temp VALUES(NULL)
SELECT *
FROM @Temp
ORDER BY COALESCE(Col,'9999-12-31 23:59:59.997')
SELECT *
FROM @Temp
ORDER BY CASE WHEN Col Is NULL Then 1 Else 0 End, Col
The 2 approaches with an integer data type
DECLARE @Temp table(Col int)
INSERT INTO @Temp VALUES(1)
INSERT INTO @Temp VALUES(555)
INSERT INTO @Temp VALUES(444)
INSERT INTO @Temp VALUES(333)
INSERT INTO @Temp VALUES(5656565)
INSERT INTO @Temp VALUES(3)
INSERT INTO @Temp VALUES(NULL)
INSERT INTO @Temp VALUES(NULL)
SELECT *
FROM @Temp
ORDER BY COALESCE(Col,'2147483647')
SELECT *
FROM @Temp
ORDER BY CASE WHEN Col Is NULL Then 1 Else 0 End, Col
相关文章推荐
- 各种数据库产品数据按某字段Order by时null的位置问题
- 转自:http://m.blog.csdn.net/article/details?id=6554168 在使用order by语句进行查询结果排序时,不同的数据库对于被排序字段数据行为null的情况
- ItemAdding实现数据验证--中文字段,properties.AfterProperties值为null的问题
- 关于EXCEL数据导入到SQLSERVER中字段存在NULL的问题
- Redis主从读数据不一致与hmget()获取字段为null的问题解析
- 从别的数据库导入数据时主键和自增长字段属性丢失问题
- 数据库导入导出数据以及字段类型为timestamp时的设值问题
- 关于springmvc 返回json数据null字段的显示问题
- hibernate在Oracle中插入数据,默认字段被设置为null的问题解决
- Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库 自定义日志记录功能,按日记录,很方便 C#常量和字段以及各种方法的语法总结 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法 asp.net webapi 自定义身份验证
- MVC POST数据到后台,对应Model接收字段全部为null问题
- 查询数据库中为null字段的数据
- mysql中修改数据库,数据库表,数据库表字段的编码问题
- 类型匹配问题:数据库字段类型与java数据类型的对应关系
- 关于mybatis读取数据库字段text类型时,读出数据为地址,并不是字符串的问题
- 关于EXCEL数据导入到SQLServer中字段存在NULL的问题
- 关于EXCEL数据导入到SQLSERVER中字段存在NULL的问题
- 数据库中只有一个时间字段,查找一个时间段的数据问题(mybits)
- 关于java中向数据库中插入数据时,报错Caused by: java.lang.NullPointerException的问题
- Java+MSSQL数据库,日期字段数据存储问题