我有一个简单的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中是否有人设置可能已更改以使原始代码不再获取字段中的差异?
由于
答案 0 :(得分:1)
NULL <> anything
unknown
而非true
。 SQL使用三个值逻辑(false / true / unknown),并且谓词需要在true
子句中为要返回的行计算where
。
事实上,在标准SQL中,除了NULL
之外,与IS [NOT] NULL
的任何比较都会产生unknown
。包括WHERE NULL = NULL
你没有陈述RDBMS但是如果它支持IS DISTINCT FROM
你可以使用它,或者如果你使用MySQL它有一个空的安全等式运算符<=>
你可以否定。
你说你以前认为它的表现不同。如果您使用的是SQL Server,则可能会以某种方式使用ANSI_NULLS
的其他设置,但不推荐使用此设置,并且您应该重写依赖于它的任何代码。
您可以使用IS DISTINCT FROM
WHERE EXISTS (SELECT a.PlayDate EXCEPT SELECT b.PlayDate)
答案 1 :(得分:0)
即使NULL也不能等于NULL。
select * from table where column = null;
select * from table where column <> null;
NULL
。相反,人们只能说“是”或“不是”
(在讨论NULL
s时,没有“相等”一词。从表中选择*,其中列为IS NULL;
从表中选择*,其中列IS NOT NULL;