我想知道何时使用比较运算符(例如>
或)执行行子查询时>=
,比较顺序是使用字典顺序(即字典)顺序定义的还是按元素定义的?
也就是说,对于ROW (A, B)
,应
(79, 48) > (75, 52)
是子句中的TRUE
(字典)或FALSE
(按元素)在行查询中WHERE
?
我在PostgreSQL中对此进行了测试,似乎它使用的是字典顺序,即(79, 48) > (75, 52)
是TRUE
因为79 > 75
第二个组件因此无关紧要。到处搜索,MySQL似乎也是如此:MySQL行子查询比较问题,并且MySQL文档在这一点上似乎令人困惑。搜索postgresql row subquery
不会显示太多关于比较顺序的信息。
从计算机科学的角度来看,字典的顺序是有意义的,但对于数据库用户来说,这可能有点奇怪,因为行的顺序现在取决于您在SQL中首先列出的列。例如,使用字典顺序,我们应该具有:
(52, 75) > (48, 79)
为ROW (B,A)
。比较相同的行,因为列B
在最前面,所以顺序恰好相反。
我的问题是:
这是SQL标准/跨供应商的行为(在行查询中使用字典顺序)还是特定于实现?有什么参考吗?
这在Postgres手册的行构造器比较一章中进行了介绍:
对于
<
,<=
,>
和>=
的情况下,行元素进行比较左到右,只要不相等的或空对元素被发现停止。如果这对元素中的任何一个为null,则行比较的结果未知(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值除外,NULL值以默认的升序排在最后。
有关的:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句