在NAME表中,第一列为空,但没有选择任何行。请帮我理解。
SELECT * FROM NAME WHERE FIRST != '1'
null
的比较都是false - 包括=
、<>
、>
、<
等等。你也不能在IN
列表中使用null
- 它会被忽略。而且,两个null
甚至不相等。SELECT * FROM NAME WHERE FIRST IS NULL OR FIRST != '1'
任何与NULL的比较都会返回NULL,它等价于FALSE。即使是不相等也是如此。
如果您想包括NULL值,请执行以下操作之一:
where first <> '1' or first is null
或者where coalesce(first, '<null>') <> '1'
在Oracle中,除非您明确要求,否则null不被视为有效的选择值:
select * from name where (first != '1') or first is null
select * from name where nvl(first,'0') != '1'
那是正确的,因为NULL永远不能与其他任何东西比较....
您唯一的选择是在命令中包含一个NULL检查作为“or”的条件。
SELECT * FROM NAME WHERE FIRST!=1 OR FIRST IS NULL
NULL很蠢。没错。
NULL是邪恶的。
如果X为NULL且Y也为NULL,则X实际上等于Y,因为它们都是NULL。
我无法说
IF X IN ('a','B','C',null)
这也是一个麻烦,但现在我必须这样说
IF ( X IN ('a','B','C') or X is NULL )
这样做既浪费时间,如果我忘记了括号还会存在错误的风险。
更令我不满的是,NULL本来就不应该出现。字段(呃...好吧,孩子们,我会称它们为列)应该始终被初始化。没错,停止使用nulls。不要允许它们。默认值应该总是零或空白,这样那些懒得在软件中初始化列的人也会自动初始化它们。
有很多情况下,未定义默认值为零或空白会使生活比必要的困难。