SQL ROW子查询中的比较的顺序定义?

时间:2016-04-07 01:19:32

标签: mysql sql postgresql subquery lexicographic

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

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

(79, 48) > (75, 52) 
TRUE子句的行查询中,

FALSE(字典)还是WHERE(逐元素)?

我在PostgreSQL中对此进行了测试,似乎它使用了字典顺序,即(79, 48) > (75, 52)TRUE,因为79 > 75而第二个组件没有#{1}}因此。在搜索时,似乎MySQL的情况也是如此:MySQL row subquery comparison issue,并且MySQL文档似乎在这一点上令人困惑。搜索postgresql row subquery并未显示有关比较订单的详情。

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

 (52, 75) > (48, 79)  

代表ROW (B,A)。比较相同的行,顺序完全相反,因为列B首先列出。

我的问题是:

这种行为(在行查询中使用字典顺序)是来自SQL标准/跨供应商还是特定于实现?对此有何引用?

1 个答案:

答案 0 :(得分:1)

Postgres 手册的Row Constructor Comparison一章中记录了这一点:

  

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

  

注意:在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值,排序 last 按默认升序排列。

相关: