我有一个简单的 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) 并且谓词需要评估为 true
在where
要返回的行的子句。
事实上在标准 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/