Sql 当一个值为空时,未拾取不匹配

Sql 当一个值为空时,未拾取不匹配,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

我有一个简单的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 to,内容如下:

WHERE  ISNULL(a.PlayDate,'') <> ISNULL(b.PlayDate,'')
SQL中是否存在某个设置,有人可能会更改该设置,以使原始代码不再拾取字段中的差异

谢谢

这不是真的。SQL使用三值逻辑false/true/unknown,谓词需要在where子句中求值为true才能返回行

事实上,在标准SQL中,除了IS[NOT]NULL之外,任何与NULL的比较都会产生未知的结果。包括其中NULL=NULL

您不需要声明RDBMS,但如果它支持的是不同于它的,您可以使用它,或者如果您使用的是MySQL,它有一个空安全相等运算符,您可以否定它

你说你认为它以前的表现不同。如果您使用的是SQL Server,您可能会以某种方式使用不同的设置,但此设置已被弃用,您应该重写依赖它的任何代码


您可以在SQL Server中使用存在的位置选择a.PlayDate,而不是选择b.PlayDate进行模拟。即使NULL也不能等于NULL

以下是两个不起作用的常见查询: 从column=null的表中选择*

从列为空的表中选择*

没有大于或小于平等或不平等的概念 而不是空值。相反,人们只能说“是”或“不是” 在讨论空值时没有“equal”一词。 -编写查询的正确方法 从列为空的表中选择*

从列不为空的表中选择*

NULL <> anything