我想知道何时使用比较运算符(例如>
或>=
执行行子查询,是使用词典(即字典)顺序定义的比较顺序还是按元素定义?
也就是说,对于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标准/跨供应商还是特定于实现?对此有何引用?
答案 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 按默认升序排列。
相关: