使用 SQL Order By 和 null 的 DBMS 之间的行为一致

发布于 2024-07-10 02:12:52 字数 422 浏览 5 评论 0原文

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

在SQL Server中,按查询进行升序排列,NULL排在最前面。

SQL Server 的这种行为与 Oracle 和 DB2 一致吗?

相反,如果我在列上进行 COALESCE 以确保它在查询中不为空,那么我可能会遇到哪些性能问题(由于表扫描等)?

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

http://en.wikipedia.org/wiki/Order_by_(SQL)

I have a column in my database (a flag) with type varchar(1) that is populated either Y or NULL (not in my control).

In SQL Server, doing an ascending order by query, NULL is ordered at the top.

Is this SQL Server behaviour consistent with Oracle and DB2?

If, instead, I have a COALESCE on the column to ensure it is not null in the query, what performance issues (due to table scans and the like) could I hit?

The query needs to be consistent over all 3 databases, otherwise I will have to handle it in code, hence my thinking of using the COALESCE function.

http://en.wikipedia.org/wiki/Order_by_(SQL)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

书信已泛黄 2024-07-17 02:12:52

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

I know for a fact that DB2 Express and DB2 (at least up to v8) does not support the NULLS FIRST clause.

If you want a portable solution, you may have to opt for something like:

select * from tbl where fld is null
    union all select * from tbl where fld is not null

I think the result of the union (at least in DB2, you'll need to check the others) is guaranteed to be ordered correctly.

The coalesce will have performance implications since you're running a function for every row returned. However, it depends on the number of rows in the database.

You may well have to resort to doing two queries in code into two different record sets, then processing them in order.

EDIT: I've just checked the SQL standard and it's not guaranteed that the queries joined with a UNION ALL are sequenced; they might be inter-mixed. So it looks like you may have to resort to code running two different queries as mentioned above.

淡笑忘祈一世凡恋 2024-07-17 02:12:52

在SQL Server中,按查询进行升序排序,NULL排在最前面。 Oracle 和 DB2 的这种行为应该一致吗?

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

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

In SQL Server, doing an ascending order by query, NULL is ordered at the top. Should this behaviour be consistent for Oracle and DB2?

Apparently this is a relative newcomer to the standard.

The SQL standard's core functionality does not explicitly define a default sort order for Nulls. With the SQL:2003 extension T611, "Elementary OLAP operations", nulls can be sorted before or after all data values by using the NULLS FIRST or NULLS LAST clauses of the ORDER BY list, respectively. Not all DBMS vendors implement this functionality, however. Vendors who do not implement this functionality may specify different treatments for Null sorting in the DBMS.

め七分饶幸 2024-07-17 02:12:52

在 oracle 中你可以这样做:

ORDER BY value NULLS FIRST 

或者

ORDER BY value NULLS LAST

在 SQL Server 中尝试一下

In oracle you can do this:

ORDER BY value NULLS FIRST 

or

ORDER BY value NULLS LAST

Try it in SQL Server

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文