我编写了一个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。为什么上述查询会排除具有空值的记录。只返回第一条记录。
答案 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
。
这样做:
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