如果字段为空,为什么SQL“NOT IN('val1')”不返回?

时间:2016-01-12 07:35:13

标签: mysql sql select null

我有一个像这样的查询:

Select *
FROM table1
WHERE field1 NOT IN ('value1')

如果该行的field1null,则不会返回该行。 它对我来说看起来不合逻辑,因为null不是'value1',所以应返回该行,这可能会导致许多错误。 我明白,由于某些原因,它的工作方式如此。它们是什么?

2 个答案:

答案 0 :(得分:6)

在SQL中,NULL不是值。

SELECT NULL = NULL
# => NULL
SELECT NULL != NULL
# => NULL

因此,

  

原因null不是'value1'

NULL也不是'value1'。 NULL基本上是说“我不知道”的SQL方式。所以它可能是'value1',或者它可能不是。测试NULL的方法是

SELECT NULL IS NULL;
# => 1

因此,试试这个:

WHERE field1 NOT IN ('value1') OR field1 IS NULL

专门处理案件。

答案 1 :(得分:2)

null不是一个价值 - 它缺乏价值。将其视为缺失数据。每当它参与一个处理值的逻辑运算符(例如in)时,它的结果就是"未知" - "问题:以下值是一个缺失值?答:我不知道"。

因为"未知"如果不是,则不评估该行。如果您要处理null,则必须明确地处理in,例如,使用SELECT * FROM table1 WHERE field1 IS NULL OR field1 NOT IN ('value1') 运算符:

-module(some_mod).
-compile(export_all).

some_fun() ->
    fun f/0.

f() ->
    ok.