0

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

在 SQL Server 中,按查询升序排列,NULL 排在最前面。对于 Oracle 和 DB2,这种行为是否应该保持一致?

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

编辑

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

编辑

我选择 Pax 作为答案,因为它处理了问题的两个部分并提供了有用的解决方法,但是,感谢 me.yahoo.com/a/P4tXrx 提供指向此处的链接

4

3 回答 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 标准,不能保证与 a 连接的查询UNION ALL是有序的;它们可能是相互混合的。因此,您可能不得不求助于运行上述两个不同查询的代码。

于 2008-11-26T01:04:03.230 回答
1

在 SQL Server 中,按查询升序排列,NULL 排在最前面。对于 Oracle 和 DB2,这种行为是否应该保持一致?

显然,这是该标准的一个相对较新的成员

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

于 2008-11-26T01:05:56.910 回答
0

在 oracle 中,您可以这样做:

ORDER BY value NULLS FIRST 

或者

ORDER BY value NULLS LAST

在 SQL Server 中尝试

于 2008-11-26T00:48:33.963 回答