其中field1<> field2
field1和field2是日期时间。有时,他们中的任何一个都有零,尽管很少有两个都有空。
但是,这种编码方法似乎完全排除了所有记录,其中一个是null的。
我没想到。设置ANSI nulls打开或关闭不会有任何区别 - 因此不要从那里开始。:)
还有其他解释吗?当然,一个isnull(field,"某个日期")解决了 - 但是对方的解释是什么?
我知道一些 null是空的,并且许多类似的null行为。但这并没有帮助我理解为什么整个说法会评估为true?
三个有价值的逻辑。1 <> NULL
不是正确的。这也不是错误的。它是未知,第三个真实值。当记录评估为true时,该子句将返回记录,而未知子句并不是正确。这就是为什么始终处理nulls 的最佳实践。这是SQL Server T-SQL的特定文档。
您想要:
WHERE (FIELD1 <> FIELD2
OR (FIELD1 IS NULL AND FIELD2 IS NOT NULL)
OR (FIELD2 IS NOT NULL AND FIELD2 IS NULL))
此外,某些RDBMS可能支持以下内容:
WHERE FIELD1 IS DISTINCT FROM FIELD2
SQL Server不是其中之一,而是IIRC,SYBASE(T-SQL的另一方言) IS 。。
您是否尝试过使用与Intersect或除外的使用?这是一个独立的例子:
-- Filter for rows where ColA is the same as ColB
select Example.*
from (values
(N'A', null)
, (N'B', N'B')
, (null, N'C')
, (null, null)
) as Example (ColA, ColB)
where exists (
select Example.ColA
intersect
select Example.ColB
);
-- Filter for rows where ColA is not the same as ColB
select Example.*
from (values
(N'A', null)
, (N'B', N'B')
, (null, N'C')
, (null, null)
) as Example (ColA, ColB)
where exists (
select Example.ColA
except
select Example.ColB
);
"为什么"是 3值逻辑的"直接答案"。简而言之,零永远不会等于任何东西,不是真的,不是错误的,不是空。它也不是不等于任何东西。所以,两个,
X = NULL
X <> NULL
是错误的。
许多人谈到一个无效的价值,但这是一个错误的称呼。null表示丢失信息:缺乏价值。正确考虑它的正确方法是关于的标记。您不能将某物与一无所有,或者一无所有,而无效也是如此。
似乎很奇怪的原因是没有其他常用的编程语言为缺失的信息提供,并且他们使用熟悉的布尔(2值)逻辑。SQL的概念是"如果我们拥有的价值,这是一个价值的去处"。您不会遇到许多其他地方的想法。
尝试将空值设置为低或高的日期值,这两个字段都不会设置为使用isnull函数
ISNULL(Field1, '1/1/1900') <> ISNULL(Field2, '1/1/1900')