空<>即使对于id我们在一个中有null而在另一个中有数字,数字也不显示任何内容

时间:2013-01-31 16:15:23

标签: sql

很抱歉,如果这是非常基本的。 这是我注意到的 以下是表格:

Table1                         Table2
ID     Value                 ID   Value
1      (null)                 1     0
2      2                      2     2
3      (null)                 3     3

所以我使用了以下声明:

Select T1.ID,T1.Value,T2.value
from
Table1 T1,
Table2 T2
where 
T1.ID=T2.ID
and T1.Value<>T2.Value;

我期待输出显示1,3 ID,但它没有显示任何不是我很困惑假设我想看到所有值当一个表为其他表值为null时我该怎么做。

4 个答案:

答案 0 :(得分:3)

嗯,问题是除了IS NULL之外,与NULL的比较总是导致FALSE。所以该条款应该是:

where T1.ID=T2.ID and
      coalesce(T1.Value, t2.value - 1) <> coalesce(T2.Value, t1.value -1);

或者与NULL值匹配的东西。

顺便说一句,您还应该使用正确的连接语法。因此,查询看起来应该更像:

Select T1.ID,T1.Value,T2.value
from Table1 T1 join
     Table2 T2
     on T1.ID=T2.ID and
        ((T1.Value <> T2.Value) or
         (t1.value is not null and t2.value is null) or
         (t1.value is null and t2.value is not null)
        );

答案 1 :(得分:2)

您必须使用LEFT JOIN而不是INNER JOIN,因为您要查找不匹配的值。

Select  t1.ID,T1.Value,T2.value
from    Table1 T1
        LEFT JOIN Table2 T2
            ON T1.ID=T2.ID AND
                t1.value = t2.value
where  t2.value IS NULL

要充分了解联接知识,请访问以下链接:

答案 2 :(得分:2)

Select T1.ID,T1.Value,T2.value
from
Table1 T1,
Table2 T2
where 
T1.ID=T2.ID
and (T1.Value<>T2.Value OR (T1.Value IS NULL AND T2.Value IS NOT NULL) OR (T2.Value IS NULL AND T1.Value IS NOT NULL));

答案 3 :(得分:1)

空值很特殊。你可以使用像

这样的复杂查询来完成
Select T1.ID,T1.Value,T2.value
  from
  Table1 T1,
  Table2 T2
  where 
  T1.ID=T2.ID
  and ((t1.value is null or t2.value is null)
       and !(t1.value is null and t2.value is null)
       or t1.value <> t2.value);

Link to SQLFiddle

请注意,语法会有所不同,具体取决于您使用的SQL的风格。