【问题标题】:IN Operator SQLIN 运算符 SQL
【发布时间】:2010-02-04 20:03:37
【问题描述】:

我有一个名为 NUMS 的表,其中只有一列 n。
我在其中填充值 1,2,3,4,5,null 。

现在是一个查询

SELECT n FROM Nums 
 WHERE n IN (1, 2, null)

在这种情况下,我猜它已转换为

SELECT n FROM Nums 
 Where n = 1 OR n = 2 OR n = null   

我还将 n 与一个 null 值进行比较,它应该产生未知并且它应该返回一个空集。但是它返回 1,2(null 不返回,尽管包含在 IN 运算符中)

现在是一个查询

SELECT n FROM Nums WHERE n NOT IN(1, 2, null)  

...转换为:

SELECT n FROM Nums 
 Where n!=1 AND n!=2 AND n!=null  

我上面所说的在这里有效,它没有返回任何东西。

谁能详细解释发生了什么。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这是因为 null = null 始终为 false 用于 null 的运算符是 ISIS NOT 您可以使用下面的查询来获得预期的输出

    SELECT n FROM Nums WHERE n IN (1,2) OR n IS NULL
    

    [编辑]谢谢@Buckwad

    【讨论】:

    • ALL 谓词在这里是不明确的,因为第一个查询中的“n”永远不能为 NULL
    • 我认为这更简单地写成:SELECT n FROM Nums WHERE n IN (1,2) OR n IS NULL
    【解决方案2】:

    好的,我找到了答案

    SELECT n FROM Nums    
    WHERE n NOT IN (1, 2, null)
    

    计算为

    SELECT n FROM Nums  
    n!=1 AND n!=2 AND n!=null
    

    上次比较的结果将始终为 UNKNOWN。
    AND的真值表表明,一旦其中包含一个Unknown(U,T)(U,F),(U,U),结果只能是U或F(U = Unknown,F = False)因此它不会包含在结果集中。

    如果发生

    SELECT n FROM Nums
    WHERE n IN (1, 2, null) 
    

    等于

    SELECT n FROM Nums
    WHERE n = 1 OR n =2 OR n=null
    

    现在对于 n=1 的行,操作 n=1 将变为 true
    对于 n=2 的行,操作 n=2 将变为 true
    并且对于所有行 n=null 将是未知的

    所以它在结果集中给出 1 和 2。
    希望你们喜欢它。
    任何人都可以将我的回复标记为答案

    【讨论】:

    • 只有你可以将这个标记为答案,并且你必须等待两天才能做到。
    【解决方案3】:

    null 没有返回,尽管包含在 IN 运算符中

    因为n = NULL评估; NULL 不能等于 NULL。它需要被处理为n IS NULL(或类似的适当语法)以返回 NULL 行/记录。

    【讨论】:

    • NOT IN 变为 != 与 AND 您对 1,2,3,4,5,null 集合的查询应返回所有记录,因为:1 != 1 (false) OR 1 != 2 (true) -> 2 != 1 (true) -> 以此类推
    • n==1 OR n=2 OR n=null 你看我正在比较所有的 n(s) 和 null 所以它应该返回空集。
    【解决方案4】:

    您不能直接与 null 进行比较。要查找列的值是否为 null,您必须使用类似以下内容的内容:

    SELECT n
    FROM Nums
    WHERE n IS NULL
    

    【讨论】:

      【解决方案5】:

      我还将 n 与一个 null 值进行比较,它应该产生未知并且它应该返回一个空集。

      不应该 如果您需要在其他行中填充 NULL 值,imo 的最佳方法是:

      SELECT n FROM Nums WHERE n IN(1,2)
      UNION
      SELECT NULL
      

      现在是一个查询

      SELECT n FROM N NOT IN(1, 2, null)

      ...转换为:

      我上面所说的在这里有效,它没有返回任何东西。

      没错,因为没有任何东西可以等于 NULL,并且对于 NULL 比较,使用的是 NULL 语句

      【讨论】:

      • 我正在像这样比较每个 n (1,2,3,4,5,null) n==1 OR n=2 OR n=null 所有 n(s) 将返回未知,因为n=null 对所有 n 产生 UNKNOWN。这就像 (true/false) OR (true/false) OR (Unknown) 对于每个 n。这将产生 unknown 最终返回一个空集。
      • 所以?我知道,我回答说“不应该”
      • 从 NUMS WHERE n IN(null,1,2); 中选择 n它正在返回 1 和 2。请检查。
      • 所以?我知道这一点,但您希望它返回 1、2 和 NULL >>“null 未返回,尽管包含在 IN 运算符中”
      • 为什么不包含 null ?答案:coz null=null 将评估为 UNKNOWN。 SIMILARLY 1=null 应该评估 UNKNOWN 所以它不应该返回任何东西。你知道吗?
      【解决方案6】:

      如果IN 列表在任意位置包含NULL 值,则整个列表的结果为UNKNOWN

      使用正确的默认值 ANSI NULLS,当您将 NULLNULL 进行比较时,结果不正确,而是 UNKNOWN

      【讨论】:

      • 从 NUMS WHERE n IN(null,1,2) 中选择 n;它正在返回 1 和 2。请检查
      【解决方案7】:
       SELECT n FROM Nums  
       WHERE n IN (1, 2)
        Or n Is null
      

      这将检索您打算获得的内容。正如 Mitch 所说,通常与 Null 的比较产生UNKNOWN。这是因为 NULL 本身被定义为未定义的值。这就像说我住在诺丁汉、伯明翰和其他地方。在世界地图上寻找某个地方可能会有点棘手,因为它是未定义的。

      【讨论】:

        猜你喜欢
        • 2013-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 2014-07-21
        相关资源
        最近更新 更多