为什么我的SQL查询!="Some Value"不返回任何NULL行?

Gri*_*der 2 sql linq oracle

我正在为我的MVC项目查询一个Oracle数据库,我在SQL中发现了一些我很好奇的东西.为什么此Query不返回VALIDATED_BY列为NULL的行?

SELECT *
FROM DM_SSA_DEV.REQUESTS
WHERE BATCH_ID = 1399
AND VALIDATED_BY <> 'AUTOUSER'
Run Code Online (Sandbox Code Playgroud)

当我注释掉最后一行时,我得到了预期的481结果:

SELECT *
FROM DM_SSA_DEV.REQUESTS
WHERE BATCH_ID = 1399
--AND VALIDATED_BY <> 'AUTOUSER'
Run Code Online (Sandbox Code Playgroud)

最后我发现我可以通过显式处理NULL来绕过这个问题.这是正确的做法还是有更好的方法,为什么?

SELECT *
FROM DM_SSA_DEV.REQUESTS
WHERE BATCH_ID = 1399
AND (VALIDATED_BY <> 'AUTOUSER' OR VALIDATED_BY IS NULL)
Run Code Online (Sandbox Code Playgroud)

PS我也在我的项目中使用Linq,所以这是我使用的代码.效率最高?

db.REQUESTS.Where(r => r.BATCH_ID == batchId && (r.VALIDATED_BY != "AUTOUSER" || r.VALIDATED_BY == NULL)).ToList<REQUEST>();
Run Code Online (Sandbox Code Playgroud)

use*_*740 7

NULL 永远不会等于(=)任何其他值,甚至是另一个NULL(它有点像浮点NaN).这还包括涉及NULL的不相等的表达式.

x = y OR (y IS NULL and x IS NULL)当将NULL值视为相等时,意图可以表示为.

x <> y OR x IS NULL假设y永远不为NULL,则表示不等于或NULL且不相等的特殊情况.

另一种选择是合并,COALESCE(x, '*') = COALESCE(y, '*')取决于优化程序可信任的程度以及合并值与NULL的相等性.可能还有其他供应商扩展.

LINQ/EF将x == null(C#,null必须是常量表达式)转换为x IS NULL(SQL).