sql - 当一个值为 null 时未拾取不匹配

标签 sql null

我有一个简单的 SQL 查询,其中比较两个表中不匹配的值。 昨天,我们发现了一个字段为空而另一个字段不为空的问题,但未检测到不匹配。 据我所知,直到昨天,逻辑一直有效。 以下是 SQL 的逻辑:

CREATE TABLE Table1
(UserID INT,PlayDate DATETIME)

CREATE TABLE Table2
(UserID INT,PlayDate DATETIME)

INSERT INTO Table1 (UserID)
SELECT 5346

INSERT INTO Table2 (UserID,PlayDate)
SELECT 5346,'2012-11-01'

SELECT a.UserID
FROM   Table1 a
INNER JOIN
       Table2 b
ON     a.UserID = b.UserID
WHERE  a.PlayDate <> b.PlayDate

即使 PlayDate 值不同,也不会返回任何值。

我现在已经更新了 WHERE 以阅读:

WHERE  ISNULL(a.PlayDate,'') <> ISNULL(b.PlayDate,'')

SQL 中是否有某个设置可以被更改以导致原始代码不再获取字段中的差异?

谢谢

最佳答案

NULL <> anything

unknown不是 true . SQL 使用三值逻辑 (false/true/unknown) 并且谓词需要评估为 truewhere要返回的行的子句。

事实上在标准 SQL 中与 NULL 的任何比较除了 IS [NOT] NULL产量 unknown .包括WHERE NULL = NULL

您没有声明 RDBMS,但如果它支持 IS DISTINCT FROM你可以使用它,或者如果你使用的是 MySQL,它有一个 null 安全相等运算符 <=> 你可以否定。

你说你认为它以前的行为不同。如果您使用的是 SQL Server,则可能会为 ANSI_NULLS 使用不同的设置不知何故,但此设置已被弃用,无论如何您都应该重写任何依赖于它的代码。

你可以模拟IS DISTINCT FROM在 SQL Server 中使用 WHERE EXISTS (SELECT a.PlayDate EXCEPT SELECT b.PlayDate)

关于sql - 当一个值为 null 时未拾取不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13452089/

相关文章:

ruby - Ruby 方法应该返回 nil 还是空对象

go - 如何在 Go 1.18 中对 nil 值进行模糊测试?

grails - 执行运行应用程序时,Grails项目在UnmodifiableMap中抛出null

sql - 超过 3 个表的棘手 SQL 语句

php - 'where in' 子句中的 PDO 绑定(bind)值不起作用

mysql - 产品/选项/Exras 表的审核日志记录?

sql - Oracle中没有一个函数错误

mysql - 如何实现连接运算符

javascript - 通过用户生成形式值来创建对象。 'addEventListener' 为空

c# - 检查 null 线程安全吗?