与 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 排序依据和空值的数据库一致性的主要内容,如果未能解决你的问题,请参考以下文章