SQL ROW 子查询中比较的顺序定义?
Posted
技术标签:
【中文标题】SQL ROW 子查询中比较的顺序定义?【英文标题】:order definition for comparisons in SQL ROW subqueries? 【发布时间】:2016-04-07 01:19:32 【问题描述】:我想知道何时使用比较运算符(例如 >
或 >=
)执行行子查询,比较顺序是使用字典(即字典)顺序定义还是按元素定义?
也就是说,对于ROW (A, B)
,应该
(79, 48) > (75, 52)
在WHERE
子句的行查询中是TRUE
(字典)还是FALSE
(元素方式)?
我在 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 标准/跨供应商还是特定于实现?有这方面的参考吗?
【问题讨论】:
【参考方案1】:这在 Postgres 手册的 Row Constructor Comparison 章节中有记录:
对于
<
、<=
、>
和>=
情况,比较行元素 从左到右,一旦有不相等或为空的元素对就停止 被发现。如果这对元素中的任何一个为空,则结果 行比较未知(空);否则比较这个 一对元素决定结果。例如,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 标准。
这与SELECT
查询的ORDER BY
子句中的逻辑基本相同:从左到右比较项目,直到找到第一个不等式 - 除了 NULL 值,它排序 last默认升序。
相关:
SQL syntax term for 'WHERE (col1, col2) < (val1, val2)'【讨论】:
以上是关于SQL ROW 子查询中比较的顺序定义?的主要内容,如果未能解决你的问题,请参考以下文章
sql Prev / Next row - mysql select - 变量,corelated子查询