当一个值为null时,不会拾取不匹配

时间:2012-11-19 10:40:02

标签: 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中是否有人设置可能已更改以使原始代码不再获取字段中的差异?

由于

2 个答案:

答案 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

在SQL Server中模拟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;