`

各种数据库产品数据按某字段Order by时null的位置问题

阅读更多
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的排最前:
ORDER BY CASE WHEN Col Is NULL Then 0 Else 1 End, Col

Example 2:
mssql/mysql order by,按Col升序,但是Col为null的排最后:
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

分享到:
评论
1 楼 wcily123 2011-03-18  
3q 帮我大忙了

相关推荐

    PGSQL统计一个数据库所有数据库空字段的函数

    ### PGSQL统计一个数据库所有数据库空字段的函数 在PostgreSQL(简称PGSQL)中,有时我们需要统计数据库中所有表的空字段数量。这在数据分析、数据清洗等场景下非常有用。下面详细介绍如何创建并使用一个自定义函数...

    常用数据库的自增字段创建方法汇总

    ### 常用数据库的自增字段创建方法汇总 在数据库设计中,自增字段(自动增长字段)是非常常见的一种需求。它主要用于为主键提供唯一且连续递增的标识符,便于记录数据条目的唯一性。不同的数据库系统支持不同的自增...

    Oracle数据库表中字段顺序的修改方法

    select obj#, col#, name from sys.col$ where obj# = '103756' order by col#; ``` 3. 直接更新`sys.col$`表中的`col#`字段以调整顺序,如: ```sql update sys.col$ set col#=2 where obj#=103756 and name='...

    PostgreSQL获取表名和字段名

    `ORDER BY tablename`使得结果按表名排序。 2. **获取数据库中所有表名及表的注解信息** 如果需要获取每个表的注解(即对象描述),可以结合`pg_tables`和`pg_class`系统目录视图。`obj_description`函数用于获取...

    获取数据库表、视图、字段等.docx

    在开发应用程序时,经常需要与数据库进行交互,这包括获取数据库中的表、视图以及它们的字段信息。本文将详细介绍如何通过SQL查询来获取这些信息,以SQL Server 2005为例。 首先,我们需要了解SQL Server的系统表。...

    数据库实验一 基于Sakila的数据库操作

    - 计算最高租金的前3名顾客:涉及`customer`和`payment`表的聚合查询,使用`GROUP BY`和`SUM`函数,再用`ORDER BY`和`LIMIT`进行排序和限制。 - 找出总租金最高的影片:需要连接`payment`, `rental`, `inventory`,...

    得到SQL数据库中所有表字段及字段中文描述.docx

    在SQL数据库中获取所有表的字段及其中文描述是一项常见的需求,这对于数据库管理和数据分析至关重要。以下将详细介绍如何实现这一目标,以及涉及到的相关SQL语法。 在SQL Server 2000中,可以通过以下查询来获取...

    Excel VBA与数据库整合应用范例精讲

    实例2-19 获取数据库中某数据表的所有字段信息(Access) 实例2-20 获取数据库的所有查询信息(ADOX) 实例2-21 获取数据库的所有查询信息(DAO) 实例2-22 获取数据库的模式信息(OpenSchema) 实例2-23 获取...

    获取数据库表、视图、字段等.pdf

    在IT行业中,数据库是至关重要的组成部分,用于存储和管理各种数据。本文将深入探讨如何获取数据库中的表、视图及字段等信息,特别是在SQL Server 2005环境下。这通常涉及到对系统表的查询,以便获取元数据,进而...

    Excel VBA与数据库整合应用范例精讲书及源代码

    实例2-19 获取数据库中某数据表的所有字段信息(Access) 实例2-20 获取数据库的所有查询信息(ADOX) 实例2-21 获取数据库的所有查询信息(DAO) 实例2-22 获取数据库的模式信息(OpenSchema) 实例2-23 获取...

    MySQL数据库工程师常见面试题

    只有当表中的某个字段允许 NULL 或者定义了 DEFAULT 值时,才可以在 INSERT 语句中省略该字段。 #### 问题5:本地索引与全局索引的差别与适用情况 - **本地索引**:对于每个表分区,都有一个对应的索引分区。当表...

    abap逻辑数据库ABAP数据库操作

    通过使用内表读取数据时,通常会用到loop语句。 查询条件的动态指定允许在程序运行时根据不同的条件执行查询,例如可以在报表的选择屏幕上由用户输入查询条件。多表结合查询涉及到将两个或多个表中的数据进行联合...

    数据库 数据类型大全

    根据提供的标题、描述、标签及部分内容,我们可以整理出与MySQL及Oracle数据库相关的多个知识点,具体如下: ### 一、数据库基础知识 #### 1. 数据库(Database)与数据库管理系统(DBMS) - **数据库**:一种用于...

    西南交通大学第四章-数据库作业.docx

    - 因此,在使用某个具体数据库产品时,需要参考其文档了解支持的具体SQL语法和特性。 5. **利用ALTER TABLE可以做哪些事?** - 修改现有表的结构。 - 增加、删除或修改列。 - 改变已有列的数据类型、长度、是否...

    oracle数据库 数据查询相关知识

    2. **理解数据更新操作时要注意数据的完整性**:学习如何在更新表数据时保持数据的一致性和完整性,避免因错误的数据更新而导致的问题。 3. **理解PL/SQL语句对表数据操作的灵活控制功能**:深入理解PL/SQL提供的...

    SQL.zip_SOL_数据定义_数据库管理_数据查询

    更复杂的查询可能包括WHERE子句来过滤结果,JOIN操作来合并不同表的数据,GROUP BY和HAVING子句来进行分组和条件过滤,以及ORDER BY来排序结果。例如,找出每个部门的员工人数: ```sql SELECT Department, COUNT(*...

    数据库结构文档生成器

    - `OrderBy A.id, A.colorder`:按表ID和字段顺序进行排序。 **三、文档生成流程** 1. **准备阶段** - 确定需要生成文档的数据库和表范围。 - 编写如上所示的SQL查询语句。 2. **执行阶段** - 在目标数据库中...

    得到SQL数据库中所有表字段及字段中文描述.pdf

    在SQL Server 2005中,获取数据库中所有表的字段及字段中文描述通常是为了进行数据管理和文档化。以下是一些关于这个SQL查询的重要知识点: 1. **系统视图和对象**: - `sys.columns`:此视图包含了数据库中所有...

    数据库数据查询实验报告.docx

    ### 数据库数据查询实验知识点概览 #### 实验背景与目的 本次实验是宁夏师范学院数学与计算机科学学院《数据库》课程的一部分,旨在通过实践操作加深学生对数据库查询技术的理解和掌握。实验由褚万军老师指导,实验...

Global site tag (gtag.js) - Google Analytics