MySQL和PostgreSQL行子查询运算符

时间:2018-10-19 08:43:53

标签: mysql postgresql

在阅读MySQL文档MySQL documentation

时,我有点困惑
 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

p.s .:

  • PostgreSQL具有相同的行为。
  • Oracle失败,错误为“ ORA-01796:此运算符不能与列表一起使用”

1 个答案:

答案 0 :(得分:0)

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

  

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

     

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

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

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

看起来很奇怪。而且我不知道如何评估具有3个以上其他属性的行的比较;