代码之家  ›  专栏  ›  技术社区  ›  Mubashar

MyNullableCol<>“MyValue”不包括MyNullableCol为NULL的行

  •  0
  • Mubashar  · 技术社区  · 15 年前

    今天我发现了一个奇怪的问题,就是我有一个带有可空列的表,我尝试使用以下查询

    挑选* 身份证件 来自dbo。[MyTable] 其中MyNCol<>'我的价值'

    并希望它返回字段MyNCol中没有“MyValue”值的所有行。但它不会返回上述指定列(MyNCol)中包含NULL的所有行。 因此,我必须将我的查询重写为

    身份证件 麦考尔, 来自dbo。[MyTable]

    现在我的问题是为什么第一个查询不足以执行我想要的操作:(

    当做 穆巴沙尔

    3 回复  |  直到 15 年前
        1
  •  1
  •   Gareth Saul    15 年前

    标准为空!=无效的您可以通过更改数据库上的ANSI NULLS enabled属性来更改此行为,但这会对列存储和查询执行产生广泛的影响。或者,您可以在SQL脚本中使用SET ANSIU NULLS语句。


    SET ANSI_NULLS (Transact-SQL)

    请特别注意如何执行比较的详细信息-即使在禁用ANSI_NULLS时,列与列之间的比较也可能无法按预期进行。最佳实践是始终使用is NULL和is NOT NULL。

        2
  •  0
  •   cjk    15 年前

    不能对空值执行相等运算符。在SQL2000中,您可以检查null=null,但是在2005年,这种情况发生了变化。

        3
  •  0
  •   Aaron Bertrand    15 年前

    空=未知。所以你既不能说MyNCol='My Value',也不能说MyNCol<>'“我的值”-两者都计算为未知值(就像'foo'+MyNCol仍将变为空)。您发布的解决方案的替代方案是:

    WHERE COALESCE(MyNCol, 'Not my Value') <> 'My Value';
    

    这将包括空列,因为比较将变为false而不是未知。我不太喜欢这个选项,因为它依赖于比较中的某个魔术值,即使只有当列为NULL时才会提供这个魔术值。