【问题标题】:Is there a setting in SQL Server to have null = null evaluate to true?SQL Server 中是否有设置让 null = null 评估为真?
【发布时间】:2008-12-23 19:18:04
【问题描述】:

SQL Server 中是否有设置让 null = null 评估为 true?

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    不是SQL Server的错,是NULL值引入了三元逻辑。 null=null 永远不会是真的,而且 null null 也不是真的。

    你可以使用 ANSI_NULL OFF 但是:

    “在 SQL Server 的未来版本中,ANSI_NULLS 将始终为 ON,任何显式将该选项设置为 OFF 的应用程序都会产生错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序功能。”

    COALESCE 不会做你需要的吗?

    【讨论】:

      【解决方案2】:

      来自MSDN Documentation

      SET ANSI_NULLS OFF
      

      将创建以下比较结果:

        10  = NULL   False
      NULL  = NULL   True
        10 <> NULL   True
      NULL <> NULL   False
      

      使用以下设置,这是默认设置:

      SET ANSI_NULLS ON
      

      同样的比较会给出这些结果:

        10  = NULL   NULL (Unknown)
      NULL  = NULL   NULL (Unknown)
        10 <> NULL   NULL (Unknown)
      NULL <> NULL   NULL (Unknown)
      

      编辑:好的,所以每个 cmets,我尝试了一些特定的 SQL 来验证这不起作用的说法,这就是我发现的:

      SET ANSI_NULLS OFF
      CREATE TABLE TestTable (USERNAME VARCHAR(20))
      INSERT INTO TestTable VALUES (NULL)
      SELECT * FROM TestTable WHERE USERNAME = USERNAME
      SELECT * FROM TestTable WHERE USERNAME = NULL
      

      产生这个输出:

      [USERNAME]
      (0 row(s) affected)
      
      [USERNAME]
      NULL
      (1 row(s) affected)
      

      所以我猜这个设置是有缺陷的。我只在一个特定的报告查询中看到并使用过此设置,因此我不知道查询计划的差异使其在一个实例中起作用而不在另一个实例中起作用。

      那么没有设置有效。

      即使它确实有效,根据此处的其他答案,依赖此设置也是一个坏主意,因为它将在未来版本中从 SQL Server 中删除。

      哦,好吧。

      【讨论】:

      • ANSI_NULLS 不这样做。我正在寻找一个不使用类似 isnull(value,1) 的设置
      • 很抱歉,您需要提出您想要回答的问题。你所问的问题的答案就是我所回答的,它会做你所要求的。所以问你真正的问题,我们会看看是否有人可以回答这个问题。
      • 然后检查一下并解释为什么它不返回该行。我使用了这两种设置。 ---- set ansi_nulls off --set ansi_nulls on declare @username varchar(20) declare @test table ( username varchar(20) ) Insert into @test select null select * from @test where username = username
      【解决方案3】:

      是的,一般来说,关闭它似乎不太好。

      我只是提到了这一点,以防您进行比较时您的第一个对象在比较中可能不是空值:

      val IS NULL 可用于测试某事物是否为空。

      NULL = NULL 应该是 False,因为 Unknown = Unknown 是 Unknown 或 False。

      【讨论】:

        【解决方案4】:

        我将避免使用 ansi_nulls 设置并使用 isnull 函数,尽管它可能会使某些查询复杂化。

        【讨论】:

          【解决方案5】:

          我们可能在错误的抽象级别上处理这个问题。您似乎有一个查询,您以这样一种方式陈述了它,以至于您没有得到您期望的结果。因此,您问了一个关于如何更改数据库的问题,以便它会为您提供您所期望的,而不是数据库所理解的。

          询问如何重述您的查询以便数据库按您的意图理解它不是更好吗?

          然后你以它会使其他查询复杂化的断言结束。我认为我们中的很多人都对“哎哟”有一个普遍的反应。因为,鉴于您对 NULL 的明显理解,这可能是正确的。

          如果您能告诉我们您认为会导致这些问题的原因是什么,我们或许可以帮助我们讨论您对 NULL 的理解。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-05
            • 1970-01-01
            • 2022-01-05
            • 2021-10-20
            • 2016-06-08
            • 1970-01-01
            • 1970-01-01
            • 2023-03-04
            相关资源
            最近更新 更多