T-SQL where子句field1<> field2:它们是datetime而field2有NULLS

时间:2016-06-23 17:37:49

标签: sql-server tsql null

在哪里FIELD1<> FIELD2

FIELD1和FIELD2是日期时间。有时它们中的任何一个都有空值,尽管两者都很少有空值。

然而,这种编码方法似乎完全排除了所有记录,其中一个是空的。

我没想到这一点。设置Ansi Nulls开启或关闭没有区别 - 所以不要从那里开始。 :)

还有其他解释吗?当然,Isnull(字段,'某些日期')解决了它 - 但是对另一个的解释是什么?
我知道Something + Null是Null,还有许多类似Null的令人讨厌的行为。但这并不能帮助我理解为什么整个声明会评估为TRUE?

4 个答案:

答案 0 :(得分:1)

Three valued logicexit不是真的。这也不是假的。它是未知,第三个真值。 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)

您是否尝试将existsintersectexcept结合使用?这是一个独立的例子:

-- 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')