我在MySQL表中有一个名为CODE的列,它可以是NULL。假设我有一些CODE ='C'的行,我想在我的select结果集中忽略它。我的结果集中可以有CODE = NULL或CODE!='C'。
以下查询不会返回CODE为NULL的行:
SELECT * from TABLE where CODE!='C'
但是这个查询按预期工作,我知道这是正确的方法。
SELECT * from TABLE where CODE IS NULL OR CODE!='C'
我的问题是为什么只有CODE!='C'不会返回CODE = NULL的行?绝对'C'不是NULL。我们在这里没有比较一个角色的价值。有人可以说明为什么它不起作用?
答案 0 :(得分:42)
在MySQL中,NULL
被视为“缺失的未知值”,而不是没有值。看看at this MySQL Reference on NULL。
与NULL
的任何算术比较都不会返回true或false,而是返回NULL
。所以,NULL != 'C'
返回NULL
,而不是返回true。 / p>
与'NULL'的任何算术比较都将返回false。要在SQL中检查:
SELECT IF(NULL=123,'true','false')
要检查NULL
值,我们需要使用IS NULL
& IS NOT NULL
运营商。
答案 1 :(得分:29)
根据我的测试和文档:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html
您可以使用< =>来比较null并获得布尔结果 注意:它看起来像NOT EQ运算符,但它是EQ运算符
例如:
select x <=> y;
or
select @x <=> @y;
这也比较了字符串vs null,字符串vs字符串等
答案 2 :(得分:12)
在SQL中,NULL值是一个特殊值,与任何其他值无法比较。 与值直接比较的结果总是FALSE或NULL,具体取决于实现。
要测试空值,您应使用IS NULL
和IS NOT NULL
。
答案 3 :(得分:6)
SELECT *
FROM `table_name`
WHERE IFNULL(`column_name` != 'C', TRUE)
答案 4 :(得分:2)
从用户中选择*,其中application_id =&#39; 1223333344&#39;和name为null;
答案 5 :(得分:0)
指定的问题也可能出现在联接中,以上答案并不是特别有用。我更喜欢这样做的方法是合并成其他方式无法实现的价值。例如,
select foo from bar
inner join baz on bar.x = baz.y
如果bar.x
和baz.y
都为空,则将不起作用(join不会带来结果)。解决方法是使用
select foo from bar
inner join baz on coalesce(bar.x, -1) = coalesce(baz.y, -1)
其中-1
是“不可能的”值,表示它永远不会出现在数据集中。