例如,在工作中我们有一个包含开始和结束日期的商品表。如果报价始终在运行,则可能是结束日期的开始具有NULL值。我来了一个查询,不得不做这样的事情
WHERE ( ISNULL(end_date) OR end_date > '2014-01-01 00:00:00' ) ...
我想知道使用BETWEEN是否可行,即使结束日期的开始是NULL。
select '2014-04-24 14:54:42' BETWEEN '2014-04-24 14:54:41' AND '2014-04-24 14:54:43'; -- 1
select '2014-04-24 14:54:42' BETWEEN '2014-04-24 14:54:43' AND '2014-04-24 14:54:41'; -- 0
select '2014-04-24 14:54:42' BETWEEN '2014-04-24 14:54:43' AND '2014-04-24 14:54:43'; -- 0
select '2014-04-24 14:54:42' BETWEEN '2014-04-24 14:54:43' AND NULL; -- 0
select '2014-04-24 14:54:42' BETWEEN NULL AND '2014-04-24 14:54:41'; -- 0
select '2014-04-24 14:54:42' BETWEEN NULL AND '2014-04-24 14:54:43'; -- NULL
select '2014-04-24 14:54:42' BETWEEN '2014-04-24 14:54:41' AND NULL; -- NULL
当你得到最后两个查询的NULL结果似乎是有道理的,因为MySQL不能确定日期是在2个值之间但是从它做的数据它不是假的。由于我们使用NULL来实现有效的低值和高值,因此我们可以将NULL视为真正的业务逻辑。
这实际上是MySQL在这里说的吗?或者这更像是一种怪癖,不应该依赖它?
服务器版本:5.6.16-64.2-56-log Percona Server(GPL),版本64.2,修订版569
答案 0 :(得分:1)
是的,这是有目的的。实际上,你的答案在于MySQL中的AND
运算符机制。它适用于简短的评估方案,即使你的一个操作数是NULL
,如果另一个操作数为零(false),整个表达式将被计算为false
(零):
逻辑AND。如果所有操作数都非零且非NULL,则求值为1, 如果一个或多个操作数为0,则为0,否则返回NULL。
的MySQL>选择1&& 1;
-> 1
的MySQL>选择1&& 0;
-> 0
的MySQL>选择1&& NULL;
-> NULL
的MySQL> SELECT 0&& NULL;
-> 0
的MySQL> SELECT NULL&& 0;
-> 0
由于BETWEEN
完全等同于使用AND
评估两个表达式:(min <= expr AND expr <= max)
您的表达式NULL
- s等于:
SELECT @min<=@date_value AND @date_value<=@max
(我已经替换了值来表示结构)。因此,如果其中一个表达式被评估为false(零) - 整个表达式的结果将为false(零),而不是 NULL
。但如果不是 - 那么结果将是NULL
,因为我们无法对1 AND NULL
发表任何意见(就像在最后两次查询中一样)。
所以,决议:是,这是有意的。 是,您可以依赖事实,0 AND NULL
会产生0
(1 OR NULL
相同,导致1
)。