很抱歉菜鸟问题,但我在文档中找不到任何线索。下面的两个查询都是等效的:
SELECT * FROM t1 WHERE (column1,column2) = (1,1);
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
那么这是否意味着下面的两个查询都是等效的,对吗?
SELECT (1,2) = (1,2); #returns 1
SELECT 1 = 1 AND 2 = 2; #returns 1
因此,如果我使用">"而不是"="会发生什么?
SELECT (3,0) > (2,2); # returns 1, whaaaaaat?
SELECT 3 > 2 AND 0 > 2; # returns 0, like expected
那里发生了什么? 为什么它们不一样?!?! 我测试了其他查询...
SELECT (3,0) > (2,2); # 1
SELECT (0,3) > (2,2); # 0
SELECT (3,4) > (3,2);# 1
SELECT (3,0) > (3,2);# 0
SELECT (3,2,1) > (3,2,0); # 1
SELECT (3,2,0) > (3,2,0); # 0
看起来 mysql 将他所有的论点都视为一个大数字!我在文档中搜索了行构造函数语法,但我找不到任何线索!我在这里错过了什么?
关于比较运算符的文档说:
对于行比较,
(a, b) > (x, y)
等效于:(a > x) OR ((a = x) AND (b > y))
所以(3, 0) > (2, 2)
是正确的,因为3 > 2
.
这种工作方式类似于使用 ORDER BY col1, col2
时对行进行排序的方式。它基本上告诉您是否在 col1 = x, col2 = y
之后对带有 col1 = a, col2 = b
的行进行排序。
如果您查看行构造函数的文档,您会发现大于号的处理方式与等号不同:
(c2,c3) > (1,1)
c2 > 1 OR ((c2 = 1) AND (c3 > 1))
因此,(3,0) > (2,2)
莫:
3 > 2 AND 0 > 2;
而是:
3 > 2 OR ((3 = 2) AND (0 > 2));
你会得到 true 的返回,因为你只需要表达式的任何一部分在 OR
语句中保持 true,而表达式的第一部分 (3 > 2
( 保持 true。因此,您将获得 1 的预期值返回。
希望这有帮助!