为什么在从表中选择值时排除NULL值

时间:2016-07-27 07:15:55

标签: c# sql-server linq

我编写了一个sql查询来获取所有记录但不具体。

我的表格column3类型为INT,也可以包含一些空值。但是以下查询忽略了column3中包含NULL的记录。

表1:

ID | Column1 | Column2 | Column3
1     xyz        xyz       200
2     xyz        xyz       201
3     xyz        xyz       NULL
4     xyz        xyz       NULL
5     xyz        xyz       201

SQL查询:

SELECT 
    [ID], 
    [Column1], [Column2], [Column3] // (int, null)
FROM 
    [Table1] 
WHERE
    Column3 != 201

LINQ查询:

from tb in _entities.Table1
where tb.Column3 != 201

由于两个NULL不能相等,因此NULL = NULL始终为False。为什么上述查询会排除具有空值的记录。只返回第一条记录。

4 个答案:

答案 0 :(得分:2)

您需要explicitly指定您想要NULL值:

from tb in _entities.Table1
where tb.Column3 == null || tb.Column3 != 201
  

当数据,逻辑和比较运算符中存在空值时   可能会返回UNKNOWN的第三个结果而不是TRUE   或者错误。这种对三值逻辑的需求是众多逻辑的源泉   应用程序错误。

     

Transact-SQL还提供了空处理的扩展。如果   选项ANSI_NULLS设置为OFF,比较空值,例如   NULL = NULL,计算结果为TRUE。 NULL与任何数据之间的比较   值评估为FALSE

答案 1 :(得分:1)

因为SQL中的null表示' unknown'。你能说出一些你不知道的东西吗?不是201?不,你不能。

因此,您必须通过检查null相等性来明确告诉您要包​​含空值。在这方面,数据库与null == null

的C#编程语言不同

这样做:

where tb.Column3 == null || tb.Column3 != 201

答案 2 :(得分:0)

如果将NULL与任何事物(甚至是NULL)与逻辑运算符进行比较,它将返回false。所以NULL!= 201是假的。你需要使用这样的东西:

where tb.Column3 is null or tb.Column3 != 201

或者您可以使用isnull语句:

where isnull(tb.Column3, 0) != 201

答案 3 :(得分:0)

SQL Server具有与C#不同的NULL语义。在C#中,当某些东西是!= 201时,它可能为空。但是在SQL Server中,当某些东西是!= 201时,它可能不是null。因此,您必须告诉SQL Server您想要NULL或!= 201

from tb in _entities.Table1
where tb.Column3 == null || tb.Column3 != 201