mysql - 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:
- PostgreSQL 具有相同的行为。
- Oracle 失败并出现错误“ORA-01796:此运算符不能与列表一起使用”
解决方案
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 个更多属性的行的比较;
推荐阅读
- c# - 如何使用 SqlDataReader 获取 Sum 结果
- javascript - 清除间隔 + 消息并替换为链接
- kubernetes - Minikube VM 驱动程序:无 vs Virtualbox/KVM
- java - 使用来自不同类的对象将数组转换为字符串
- android - 在远程服务器上运行/控制模拟器
- pandas - 如何添加新列(而不是替换)
- azure - 如何更新 Cosmos DB 文档分区键元素?
- c++ - 如何在 Windows C++ 上检测滚轮向下?
- java - 以“自然顺序”从数组中返回数据
- java - 如何使用 Retrofit 查询某些 JSON 项目?