我正在使用以下查询:
select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and Error not in ('Timeout','Connection Error');
令人惊讶的是,该语句不包含错误值为NULL的行。我的意图是仅筛选错误值为超时''(或)
连接错误’‘的行。我需要提供其他条件(或错误为NULL)以检索正确的结果。
为什么MYSQL会滤除带有NULL值的结果?我以为IN关键字会返回一个布尔结果(1/0),现在我知道某些MYSQL关键字不返回布尔值,它也可能会返回NULL
....但是为什么将NULL当作特殊值呢?
这个 :
Error not in ('Timeout','Connection Error');
在语义上等效于:
Error <> 'TimeOut' AND Error <> 'Connection Error'
有关空比较的规则也适用于IN。因此,如果Error的值为NULL,则数据库无法使表达式为true。
要解决此问题,您可以这样做:
COALESCE(Error,'') not in ('Timeout','Connection Error');
或者更好:
Error IS NULL OR Error not in ('Timeout','Connection Error');
甚至更好:
CASE WHEN Error IS NULL THEN 1
ELSE Error not in ('Timeout','Connection Error') THEN 1
END = 1
OR
不短路,CASE可以使您的查询短路
也许一个具体的例子可以说明为什么NULL NOT IN expression
什么都不返回:
给定此数据:http :
//www.sqlfiddle.com/#!2/0d5da/11
create table tbl
(
msg varchar(100) null,
description varchar(100) not null
);
insert into tbl values
('hi', 'greet'),
(null, 'nothing');
然后执行以下html" target="_blank">表达式:
select 'hulk' as x, msg, description
from tbl where msg not in ('bruce','banner');
那只会输出“ hi”。
NOT IN转换为:
select 'hulk' as x, msg, description
from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'
无法确定,甚至不成立,甚至不成立
NULL <> 'banner'
无法确定,甚至不成立,甚至不成立
因此,空值表达式可以有效地解析为:
can't be determined AND can't bedetermined
实际上,如果您的RDBMS在SELECT上支持布尔值(例如MySQL,Postgresql),则可以看到原因:http
://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
返回null。
这也返回null:
select null <> 'Bruce' and null <> 'Banner'
鉴于您正在使用NOT IN
,它基本上是一个AND表达式。
NULL AND NULL
结果为NULL。因此,就像您正在执行以下操作:http :
//www.sqlfiddle.com/#!2/0d5da/12
select * from tbl where null
一无所有
问题内容: 是Java中的关键字吗? 问题答案: 不,它不是关键字。
问题内容: 我遇到了-在我看来-奇怪的行为: 为什么str.split()不会接受关键字参数,即使这很有意义?我在Python2和Python3中都发现了这种现象。 问题答案: 见这个bug和它的superseder。 是CPython中的本机函数,因此具有此处描述的行为: CPython实现细节: 一个实现可能会提供内置函数,这些函数的位置参数没有名称,即使出于文档目的而对其进行了“命名”,因此
问题内容: 为什么联接不好或“慢”。我知道我再听一次。我找到了这句话 问题在于联接相对较慢,尤其是在非常大的数据集上,如果联接较慢,则您的网站也很慢。从磁盘上获取所有这些单独的信息位并再次将它们重新组合在一起需要花费很长时间。 来源 我一直以为他们很快,尤其是在查找PK时。他们为什么“慢”? 问题答案: 可伸缩性是关于预计算(缓存),扩展或将重复的工作缩减为基本要件的全部目的,以最大程度地减少
问题内容: 为什么在Java中不使用const关键字? 您能看到在Java语法中使用某些可传递const或不可变关键字的任何缺点,还是为什么选择了常见的繁琐方法? 您能看到关闭请求的 原因 ,Sun提供了任何解释吗? 问题答案: 您能看到关闭请求的原因吗,Sun是否提供任何解释? 是。Sun在请求本身中提供了三个为什么不对请求执行操作的原因。我引用: “目前尚无计划将此功能添加到Java中。除了蔓
我理解这是指当前对象。所以,与其使用 为什么我不能使用 请参考下面的例子,并在最后看到最后两个评论。
我正在编写一个方法,将一条记录插入或更新到mysql表中,只有当字段“sample_time”大于表中当前记录的这个值时,才会进行更新。下面是我现在想做的事情。 但是我不知道如何通过记录的唯一键来选择,而不考虑确切的字段名称或字段编号。所以我的问题是: 我如何实现“按记录的唯一键选择,而不考虑确切的字段名称或字段编号” 或者,我如何在jooq中使用条件为重复更新的条件 提前感谢您的帮助!