Sql 当一个值为空时,未拾取不匹配
我有一个简单的SQL查询,其中在两个表之间比较不匹配的值。 昨天,我们发现了一个问题,其中一个字段为空,另一个字段为空,但未检测到不匹配。 据我所知,这种逻辑一直有效到昨天。 以下是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
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