【问题标题】:Difference between "=" and "is" in sql serversql server中“=”和“is”的区别
【发布时间】:2014-09-03 10:13:29
【问题描述】:

我在理解 SQL Server 中的 =is 运算符时遇到问题。

考虑以下示例查询,它们在各自的输出中具有不同的行为:

SELECT * FROM tableName WHERE colName IS NULL;
SELECT * FROM tableName WHERE colName = NULL;

第一个查询将提供所需的输出,即选择colName 具有null 值的那些记录。但第二次查询将导致零匹配记录。

请说明这些运算符的不同用途及其优缺点。

编辑

在这里,大多数答案都声称= 不适用于null,但以下语句将适用于null=

SET ANSI_NULLS OFF
SELECT * FROM tableName WHERE colName = NULL;

这将提供与具有is 运算符的语句相同的结果。

【问题讨论】:

  • 阅读文档通常会有所帮助。 = (Equals) (Transact-SQL)
  • 请注意,尽管在 SQL Server 的未来版本中,ANSI_NULLS 将始终为ON,而SET ANSI_NULLS_OFF 将返回错误:msdn.microsoft.com/en-us/library/ms188048.aspx
  • 使用 ANSI_NULLS OFF 是一种 hack。非标准。微软明确告诉我们不要在这里使用它:msdn.microsoft.com/en-us/library/ms188048.aspx。所以是的,如果 ANSI_NULLS OFF,等号会给你不同的结果,这是可怕的,应该避免。
  • MySql,顺便说一句,在这里对 SQL 标准进行了很好的扩展:null-safe 相等运算符 让您明确要求将 null 视为等于另一个 null。 (除了 T-SQL 中的 ANSI_NULLS OFF 之外,当 col1 和 col2 都包含 null 时,它也将 col1 和 col2 视为相等。)

标签: sql sql-server


【解决方案1】:

没有什么等于null

甚至null 不等于null

null不是一个值,更像是一个概念,或者一个标记,意思是未知的值。

因此,您需要两个运算符,一个用于相等,一个用于检查null 的概念。

一旦您开始将null 视为“未知值”,许多其他行为也很有意义。

10 + null?将未知值添加到 10?显然,您将得到另一个未知值。

欲了解更多信息,请查看the documentation of the equality operator in T-SQL

此外,请参阅SET ANSI_NULL 的文档。

请注意,文档在相等运算符之间的 x = null 行为存在冲突(文档说如果 x 不是null,它将始终是 false)而 SET ANSI_NULLS 文档说 x = null will behave equivalent to x is null when the option is turned on.

【讨论】:

  • 0 * null?将 0 乘以未知值?显然,您将得到 0 作为结果。除非你没有。
  • 如果你将 0 乘以无穷大,你会得到所谓的“不确定形式”,因为无穷大不是数字。可能有类似的原因导致 SQL 中的结果也是未知的。
  • 0 * null 是两个 int(非)值的乘积,int 没有无穷大。我认为将null 解读为“未知值”在很大程度上很有用,但并不完全正确。也就是说,我没有更好的解释。
  • 通过将 sql 设置更改为:SET ANSI_NULLS OFF,将导致与空值进行比较,请参阅编辑问题
  • 我还添加了关于相等运算符的社区注释,因为我认为这是错误的(文档方面)。
【解决方案2】:

来自http://msdn.microsoft.com/en-us/library/ms188795.aspx

To determine whether an expression is NULL, use IS NULL or IS NOT NULL instead of comparison operators (such as = or !=). Comparison operators return UNKNOWN when either or both arguments are NULL.

编辑

原始问题已更新,指出SET ANSI_NULLS OFF 允许:

select * from tableName where colName = null

目前这可能是正确的,但未来版本的 SQL Server 将设置 ANSI_NULLS 始终为 ON,任何对 SET ANSI_NULLS OFF 的调用都会导致错误。

来源:http://msdn.microsoft.com/en-us/library/ms188048.aspx

【讨论】:

    【解决方案3】:

    = NULL 始终是 unknown(这是 3 状态逻辑的一部分),但 WHERE 子句将其视为 false 并从结果集中删除。所以对于NULL,你应该使用IS NULL

    = NULL 用于赋值为 NULL 值,而IS NULL 用于确定变量是否为 NULL 值。

    null上查看这些文章

    Wikipedia NUll (SQL)
    w3schools SQL NULL Values
    SQL Tutorial, see IS NULL Operator section

    【讨论】:

      【解决方案4】:

      Null 不等于零。 Null 没有价值。它只是意味着该值可以是任何东西。它是unknown

      问。为什么select * from tableName where colName = null 返回零行?

      A.因为你不能确定一个null(未知值)是否等于另一个null(另一个未知值)。

      EG: 我有一顶魔法帽,没有人知道它会产生什么(如果有什么东西出来的话)。 你有另一顶魔法帽,没有人知道它会产生什么(如果有什么结果的话)。

      我们每个人都有一顶魔法帽,里面的东西是未知的(null)。 这两顶帽子都可以装一只兔子,或者我的帽子装着一把锤子,你的装着一个菠萝。

      如果你有这样的 if 条件..

      if(@flag<>null)

      这是一个错误,因为如果您将 null 传递给 @flag,您实际上并不知道 @flag 是否等于 null

      改用if(@flag<>isnull(null,''))

      【讨论】:

        猜你喜欢
        • 2018-05-10
        • 1970-01-01
        • 1970-01-01
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多