0

我想知道当使用比较运算符(例如>or )执行行子查询时>=,比较顺序是使用字典(即字典)顺序定义的还是按元素定义的?

也就是说,对于ROW (A, B),应该

(79, 48) > (75, 52) 

在子句的行查询中是TRUE(字典)还是(元素方式)?FALSEWHERE

我在 PostgreSQL 中对此进行了测试,似乎它使用的是字典顺序,即(79, 48) > (75, 52)因为TRUE第二79 > 75个组件因此无关紧要。环顾四周,似乎 MySQL 也是这种情况:MySQL row subquery comparison issue,而 MySQL 文档似乎在这一点上令人困惑。搜索postgresql row subquery并没有显示太多关于比较顺序的信息。

虽然字典顺序从计算机科学的角度来看是有意义的,但对于数据库用户来说可能看起来有点奇怪,因为行的顺序现在取决于您在 SQL 中首先列出的列。例如,使用字典顺序,我们应该有:

 (52, 75) > (48, 79)  

ROW (B,A). 比较相同的行,顺序正好相反,因为列B首先列出。

我的问题是:

这种行为(在行查询中使用字典顺序)是来自 SQL 标准/跨供应商还是特定于实现?有这方面的参考吗?

4

1 回答 1

1

这记录在Postgres手册的行构造函数比较一章中:

对于<、和情况<=,从左到右比较行元素,一旦找到不相等或为空的元素对就停止。如果这对元素中的任何一个为null,则行比较的结果是未知的(null);否则这对元素的比较确定结果。例如,产生 true,而不是 null,因为不考虑第三对元素。>>=ROW(1,2,NULL) < ROW(1,3,0)

和:

注意:在 PostgreSQL 8.2 之前,<不按 SQL 规范处理<=>>=情况。类似的比较ROW(a,b) < ROW(c,d) 被实现为,a < c AND b < d而正确的行为等同于a < c OR (a = c AND b < d).

这阐明了现代 Postgres 的行为符合 SQL 标准。

ORDER BY它与查询子句中的逻辑基本相同SELECT:从左到右比较项目,直到找到第一个不等式 - 除了 NULL 值,它按默认升序排序最后

有关的:

于 2016-04-07T03:00:43.040 回答