【问题标题】:column = null not woking [duplicate]column = null 不工作 [重复]
【发布时间】:2017-05-12 05:25:59
【问题描述】:

我触发了一个查询

SELECT * FROM tblEmp WHERE emp_id = 9737  AND mgr_id = NULL

它不返回任何值。直到昨天它还在这样做。可能会改变什么?我们很多人都在同一台服务器上工作,所以有人可能会改变一些东西。

为了得到结果,我必须开火

SELECT * FROM tblEmp WHERE emp_id = 9737  AND mgr_id IS NULL

这是给出正确的输出。

由于我在.Net 中使用此查询,我担心在将设置重置为以前的设置时它会中断。会吗?

【问题讨论】:

  • AFAIK 您的原始查询不应该返回任何内容。这样做的原因是,使用 equals 与 NULL 进行比较总是 NULL。而emp_id = 9737 AND NULL 也是未知数。经验教训,在与NULL 进行比较时使用IS NULLIS NOT NULL

标签: sql sql-server


【解决方案1】:

将 SQL Server 的 ANSI_NULLS 功能设置为 OFF 将允许您编写 mgr_id = NULL 并将其评估为 TRUE。

但是,以这种方式比较 NULL 是不好的做法。大多数 RDBMS 不允许这样做,大多数 DBA 不会以这种方式编写查询,ANSI_NULLS 设置已被弃用很长一段时间,并将在未来强制ON。 p>

【讨论】:

  • 很好的解释 +1 ... 也是唯一一个解释了任何结果是如何通过的
  • 感谢您的描述性回答。但是如果 ansi_nulls 再次设置为 off 会怎样。 mgr_id is null 会一样吗?
  • @Imad ANSI_NULLS 设置将默认为数据库上的任何设置。您可以使用ALTER DATABASE SET ANSI_NULLS 修改默认设置以将其默认关闭。您可以使用sp_configure user options 为每个用户配置它。否则,您将需要在每个会话中发出SET ANSI_NULLS OFF;,例如ExecuteNonQuery();
  • @Imad 非常清楚,我从未关闭此设置,因此我不能 100% 确定您需要设置什么来强制关闭所有连接。数据库提供者完全可以手动设置值。据我所知,没有办法禁止连接启用它。
【解决方案2】:

Null 不是一个值,因此您不能使用= 运算符。你应该使用is null 函数让它工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多