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

谢谢

最佳答案

NULL <> anything

unknown不是 true . SQL 使用三值逻辑 (false/true/unknown) 并且谓词需要评估为 truewhere要返回的行的子句。

事实上在标准 SQL 中与 NULL 的任何比较除了 IS [NOT] NULL产量 unknown .包括WHERE NULL = NULL

您没有声明 RDBMS,但如果它支持 IS DISTINCT FROM你可以使用它,或者如果你使用的是 MySQL,它有一个 null 安全相等运算符 <=> 你可以否定。

你说你认为它以前的行为不同。如果您使用的是 SQL Server,则可能会为 ANSI_NULLS 使用不同的设置不知何故,但此设置已被弃用,无论如何您都应该重写任何依赖于它的代码。

你可以模拟IS DISTINCT FROM在 SQL Server 中使用 WHERE EXISTS (SELECT a.PlayDate EXCEPT SELECT b.PlayDate)

https://stackoverflow.com/questions/13452089/

相关文章:

eclipse - 为什么 MANIFEST.MF 看不到来自 Maven 的 pom 的包?

.net - 如果我有一个返回不同列表的方法,我应该让它返回 ISet 而不是 IEnumer

cuda - 寄存器溢出是否可能导致 CUDA_EXCEPTION_5,Warp Out-Of-Ra

php - Wordpress wp_editor 不更新文本区域 $_POST 数据

python-2.7 - python : i defined a function in a cl

Wordpress - 在配置文件页面上删除 "Roles"

php - 如何在 wordpress 中添加自定义 HTML 表单?

xcode - 如何在 XCode/clang 中为 iPhone 编译独立的 ARM 程序集文件

jasper-reports - 字符串表达式的模式(格式)

php - Wordpress 主题选项不会保存