数据库与SQL的一致性Order By和nulllls

问题描述:

我的数据库中有一列(标志),类型为varchar(1),填充Y或NULL(这是它是如何,不在我的控制中)。数据库与SQL的一致性Order By和nulllls

在SQL Server中,按查询按升序排列,NULL排在顶部。对于Oracle和DB2,这种行为应该是一致的吗?

如果相反,我在列上有一个COALESCE以确保它在查询中不为空,我是否可能遇到任何性能问题(由于表扫描等)?

编辑

查询必须在所有3个数据库一致,否则我将不得不处理它的代码,因此我使用COALESCE函数

编辑

的思考

我选择Pax作为答案,因为它处理了问题的两个部分,并给出了有用的解决方法,但是,由于me.yahoo.com/a/P4tXrx链接到here

我知道一个事实,即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排序;他们可能会相互混合。所以它看起来像你可能不得不诉诸代码运行两个不同的查询,如上所述。

在oracle中,你可以这样做:

ORDER BY value NULLS FIRST 

ORDER BY value NULLS LAST 

尝试在SQL服务器

+0

不适用于SQL。 不幸的是,查询需要符合所有3个数据库,否则我在代码中处理它 – johnc 2008-11-26 00:54:26

在SQL Server中,按查询按升序排列,NULL排在顶部。对于Oracle和DB2,这种行为应该是一致的吗?

Apparently this is a relative newcomer to the standard

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