我的数据库中有一个类型为 varchar(1) 的列(一个标志),该列填充为 Y 或 NULL(不在我的控制范围内)。
在SQL Server中,按查询进行升序排序,NULL排在最前面。
此 SQL Server 行为与 Oracle 和 DB2 一致吗?
如果我在列上进行 COALESCE 以确保它在查询中不为空,那么我可能会遇到哪些性能问题(由于表扫描等)?
查询需要在所有 3 个数据库中保持一致,否则我将不得不在代码中处理它,因此我考虑使用 COALESCE 函数。
我知道 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
连接的查询是有序的;它们可能是混合的。因此,看起来您可能必须求助于运行上面提到的两个不同查询的代码。
在SQL Server中,按查询进行升序排序,NULL排在最前面。 Oracle 和 DB2 的这种行为应该一致吗?
SQL 标准的核心功能没有明确定义 Null 的默认排序顺序。使用 SQL:2003 扩展 T611“基本 OLAP 操作”,可以分别使用 ORDER BY 列表的 NULLS FIRST 或 NULLS LAST 子句将空值排序在所有数据值之前或之后。然而,并非所有 DBMS 供应商都实现了此功能。不实现此功能的供应商可能会在 DBMS 中为 Null 排序指定不同的处理方式。
在 Oracle 中你可以这样做:
ORDER BY value NULLS FIRST
或
ORDER BY value NULLS LAST
在 SQL Server 中尝试一下