2

我有一个简单的 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 中是否有某个设置可能已被更改以导致原始代码不再获取字段的差异?

谢谢

4

2 回答 2

1
NULL <> anything

不是。unknown_ trueSQL 使用三值逻辑(假/真/未知),谓词需要truewhere子句中计算以返回要返回的行。

事实上,在标准 SQL 中,NULL除了IS [NOT] NULLyield之外的任何比较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)

于 2012-11-19T10:41:23.573 回答
0

甚至 NULL 也不能等于 NULL。

  • 以下是两个不起作用的常见查询:

select * from table where column = null;

select * from table where column <> null;

  • 没有大于或小于NULLs 的相等或不等的概念。NULL相反,在讨论s时,只能说“是”或“不是”(没有“相等”这个词) 。

- 编写查询的正确方法

select * from table where column IS NULL;

select * from table where column IS NOT NULL;

于 2016-01-07T10:28:14.567 回答