SQL Server列比较包括Null / Not Null

时间:2016-01-20 20:24:48

标签: sql sql-server

对列对进行比较,尝试找到不匹配的

SELECT
    RecID,
    Field1,
    Field2
FROM
    TestTable
WHERE
    Field1 != Field2

但是我想在我的支票中加入Nulls。两列中的空都有效,但是在一列中为空而在另一列中为空则无效,因此需要包含在输出中

SELECT
    RecID,
    Field1,
    Field2
FROM
    TestTable
WHERE
    (Field1 != Field2) 
    OR (Field1 IS NULL AND Field2 IS NOT NULL) 
    OR (Field1 IS NOT NULL AND Field2 IS NULL) 

这是写这篇文章的最佳方式,还是有更简洁/更好的方法来进行Null / Not Null比较?

2 个答案:

答案 0 :(得分:2)

我认为你可以用更浓缩的方式编写过滤条件:

SELECT
    ID,
    Field1,
    Field2
FROM
    TestTable
WHERE
    NOT((Field1 = Field2) OR (Field1 IS NULL AND Field2 IS NULL))
;

但是,此查询将产生不正确的结果。 你的变体是正确的。

@Heinzi和Connect item提到的IS DISTINCT FROM提议的INTERSECT运算符与Paul White的一篇非常好的帖子有关:this answer

在那篇文章中Paul解释说查询处理器已经有了这个运算符,用于SELECT ID, Field1, Field2 FROM TestTable AS T WHERE NOT EXISTS ( SELECT T.Field1 INTERSECT SELECT T.Field2 ) ; 个查询。

您的示例可以重写为:

android:layout_marginBottom with  android:layout_alignParentBottom="true"
  • 产生正确的结果
  • 它有一个很好的执行计划
  • 在此表单中,可以轻松添加更多字段进行比较

答案 1 :(得分:1)

在SQL Server的未来版本中,希望有一个IS DISTINCT FROM运算符。 Go ahead and vote for it, if you like.

在此之前,你唯一的选择是解决它,就像你已经做的那样。还有其他方法可以编写它 - 另一个common variant(a <> b OR a IS NULL OR b IS NULL) AND NOT (a IS NULL AND b IS NULL) - 但我认为你必须更具可读性的解决方案。