首页 > 解决方案 > MySQL 和 PostgreSQL 行子查询运算符

问题描述

我在阅读 MySQL 文档时有点困惑MySQL 文档

 A row subquery is a subquery variant that returns a single row and can thus return more than one column value. Legal operators for row subquery comparisons are:
  =  >  <  >=  <=  <>  !=  <=>

对于“=”文档提供了很好的解释:

SELECT * FROM t1 WHERE (column1,column2) = (1,1);
is same as:
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;

但是“>”或“<”如何比较两行?该运算符的“普通”变体是什么?

create table example(a integer,b integer);
insert into example values (1,1);
insert into example values (1,2);
insert into example values (2,1);
select * from example where (a,b) > (1,1)
a | b
-----
1 | 2
2 | 1

游乐场:http ://www.sqlfiddle.com/#!9/88641/2

ps:

标签: mysqlpostgresql

解决方案


MySQL 和 PostgreSQL 具有相同的行为,让我们阅读postgres 文档

= 和 <> 情况与其他情况略有不同。如果两行的所有对应成员都不为空且相等,则认为两行相等;如果任何相应的成员不为空且不相等,则行不相等;否则行比较的结果是未知的(空)。

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

所以 (a,b) = (c,d) 评估为 a = c 和 b = d

但是 (a,b,) < (c,d) 评估为 a < b 或 (a=c and b < c)

它看起来很奇怪。而且我不知道将如何评估具有 3 个更多属性的行的比较;


推荐阅读