我的数据库中有一个列(一个标志),其类型为varchar(1),填充为Y或NULL(这是它的原理,不在我的控件中)。
在SQL Server中,通过查询执行升序操作,在顶部排序NULL。这种行为是否应该与Oracle和DB2保持一致?
如果我在列上有一个COALESCE以确保它在查询中不为空,我是否可能遇到任何性能问题(由于表扫描等)?
修改
查询需要在所有3个数据库上保持一致,否则我将不得不在代码中处理它,因此我想使用COALESCE函数
修改
我之所以选择Pax作为答案,因为它处理了问题的两个部分并提供了有用的解决方法,但是,感谢me.yahoo.com/a/P4tXrx链接到here
答案 0 :(得分: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标准,并且无法保证与UNION ALL
连接的查询是按顺序排序的;他们可能是混在一起的。所以看起来你可能不得不求助于运行两个不同查询的代码,如上所述。
答案 1 :(得分:1)
在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排序指定不同的处理方法。
答案 2 :(得分:0)
在oracle中你可以这样做:
ORDER BY value NULLS FIRST
或
ORDER BY value NULLS LAST
在SQL Server中试用