使用 SQL Order By 和 null 的 DBMS 之间的行为一致

问题描述 投票:0回答:3

我的数据库中有一个类型为 varchar(1) 的列(一个标志),该列填充为 Y 或 NULL(不在我的控制范围内)。

在SQL Server中,按查询进行升序排序,NULL排在最前面。

此 SQL Server 行为与 Oracle 和 DB2 一致吗?

如果我在列上进行 COALESCE 以确保它在查询中不为空,那么我可能会遇到哪些性能问题(由于表扫描等)?

查询需要在所有 3 个数据库中保持一致,否则我将不得不在代码中处理它,因此我考虑使用 COALESCE 函数。

http://en.wikipedia.org/wiki/Order_by_(SQL)

sql null sql-order-by
3个回答
3
投票

我知道 DB2 Express 和 DB2(至少到 v8)确实支持

NULLS FIRST
子句。

如果您想要一个便携式解决方案,您可能必须选择以下内容:

select * from tbl where fld is null
    union all select * from tbl where fld is not null

我认为并集的结果(至少在 DB2 中,您需要检查其他结果)保证排序正确。

合并将会对性能产生影响,因为您正在为返回的每一行运行一个函数。但是,这取决于数据库中的行数。

您可能不得不在代码中对两个不同的记录集执行两个查询,然后按顺序处理它们。

编辑:我刚刚检查了 SQL 标准,并不能保证使用

UNION ALL
连接的查询是有序的;它们可能是混合的。因此,看起来您可能必须求助于运行上面提到的两个不同查询的代码。


1
投票

在SQL Server中,按查询进行升序排序,NULL排在最前面。 Oracle 和 DB2 的这种行为应该一致吗?

显然这是标准的相对新手

SQL 标准的核心功能没有明确定义 Null 的默认排序顺序。使用 SQL:2003 扩展 T611“基本 OLAP 操作”,可以分别使用 ORDER BY 列表的 NULLS FIRST 或 NULLS LAST 子句将空值排序在所有数据值之前或之后。然而,并非所有 DBMS 供应商都实现了此功能。不实现此功能的供应商可能会在 DBMS 中为 Null 排序指定不同的处理方式。


0
投票

在 Oracle 中你可以这样做:

ORDER BY value NULLS FIRST 

ORDER BY value NULLS LAST

在 SQL Server 中尝试一下

© www.soinside.com 2019 - 2024. All rights reserved.