在哪里FIELD1<> FIELD2
FIELD1和FIELD2是日期时间。有时它们中的任何一个都有空值,尽管两者都很少有空值。
然而,这种编码方法似乎完全排除了所有记录,其中一个是空的。
我没想到这一点。设置Ansi Nulls开启或关闭没有区别 - 所以不要从那里开始。 :)
还有其他解释吗?当然,Isnull(字段,'某些日期')解决了它 - 但是对另一个的解释是什么?
我知道Something + Null是Null,还有许多类似Null的令人讨厌的行为。但这并不能帮助我理解为什么整个声明会评估为TRUE?
答案 0 :(得分:1)
Three valued logic。 exit
不是真的。这也不是假的。它是未知,第三个真值。 WHERE子句在计算结果为true时返回记录,而unknown不为true。这就是始终处理空值的最佳做法。 Here是SQL Server的T-SQL的特定文档。
你想:
1 <> NULL
此外,一些RDBMS可能支持这一点:
WHERE (FIELD1 <> FIELD2
OR (FIELD1 IS NULL AND FIELD2 IS NOT NULL)
OR (FIELD2 IS NOT NULL AND FIELD2 IS NULL))
SQL Server不是其中一个RDBMS,但是IIRC,Sybase(T-SQL的另一种方言)是。
答案 1 :(得分:0)
您是否尝试将exists与intersect或except结合使用?这是一个独立的例子:
-- 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
);
答案 2 :(得分:0)
“为什么直接回答”是 3值逻辑。简而言之,NULL永远不会等于任何东西,不是True,不是False,不是NULL。它也永远不会不等于任何东西。所以,两者,
X = NULL
X <> NULL
是假的。
很多人都说一个NULL值,但这是用词不当。 NULL表示缺少信息:它缺乏价值。考虑它的正确方法是作为关于值的标记。你无法将某些东西与任何东西进行比较,或者什么都不做,而对于NULL则同样如此。
它看起来很奇怪的原因是没有其他常用的编程语言提供缺少的信息,并且它们使用熟悉的布尔(2值)逻辑。 SQL的概念是“如果我们拥有价值,这就是价值所在的地方”。你不会碰到很多其他地方的想法。
答案 3 :(得分:0)
尝试将NULL值设置为低或高日期值,这两个字段都不会设置为使用ISNULL函数
ISNULL(Field1, '1/1/1900') <> ISNULL(Field2, '1/1/1900')