“之间”和“X1 <= Y <= X2”之间的区别

问题描述

以下两个 sql 查询有什么区别:

SELECT a.*,b.*
FROM df_1 AS a
LEFT JOIN df_2 AS b
ON a.id = b.id
AND a.datadate between b.sdate and b.edate;

SELECT a.*,b.*
FROM df_1 AS a
LEFT JOIN df_2 AS b
ON a.id = b.id
AND b.sdate <= a.datadate <= b.edate;
                                          

后一条语句没有给我想要的输出。 IE。存在 a.datadate 不在 b.sdate 和 e.edate 之间的行。前一条语句确实给了我想要的输出

从概念上讲,我会认为这两个语句彼此相等。显然,我错了。有什么区别?谢谢。

解决方法

这不是有效的 SQL:

AND b.sdate <= a.datadate <= b.edate

原因是解析为:

AND (b.sdate <= a.datadate) <= b.edate

布尔表达式并不适合 <=。一些数据库(嗯,MySQL)会隐式地将布尔值转换为数字。然后将这些数字隐式转换回日期。因此,在这些情况下,将与 01 对应的任何日期值进行比较。

所以,总结一下,这在大多数数据库中都是一个语法错误。并且可能会在支持语法的情况下产生难以理解的结果。

我应该注意到,可能有一些 SQL 系统确实支持这种语法。例如,我认为 SAS proc SQL 可以。