与 SQL 排序依据和空值的数据库一致性

Posted

技术标签:

【中文标题】与 SQL 排序依据和空值的数据库一致性【英文标题】:Database consistency with SQL Order By and nulls 【发布时间】:2008-11-26 00:45:17 【问题描述】:

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

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

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

编辑

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

编辑

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

【问题讨论】:

【参考方案1】:

我知道 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 连接的查询是有序的;它们可能是相互混合的。因此,您可能不得不求助于运行上述两个不同查询的代码。

【讨论】:

【参考方案2】:

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

Apparently this is a relative newcomer to the standard.

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

【讨论】:

【参考方案3】:

在 oracle 中你可以这样做:

ORDER BY value NULLS FIRST 

ORDER BY value NULLS LAST

在 SQL Server 中尝试

【讨论】:

在 SQL 中不起作用。不幸的是,查询需要兼容所有 3 个数据库,否则我在代码中处理它

以上是关于与 SQL 排序依据和空值的数据库一致性的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 中NULL和空值的区别

具有空键和空值的 HashMap

如何在流分析组中将多条记录与字符串和空值合并

关于Oracle数据库中SQL空值排序的问题

对 DataTable 字符串列进行排序,但底部为空/空

SQL Server的空值处理策略