SQL其中ID等于ID但可以为null

时间:2014-07-02 14:12:46

标签: sql where

我试图从数据库中获取一些数据。我有一个Taak表,其中包含可能的idPartij列。可能,因为它可以是真实idPartij,但也可以是null

我得到的查询:

SELECT T.idTaak,
       T.Taaktype,
       P.Partijnaam,
       T.Naar,
       T.UltimatumDatum,
       T.Opmerking,
       T.Status,
       T.Prioriteit
FROM Taak AS T,
     Partij AS P
WHERE T.idPartij = P.idPartij
ORDER BY idTaak DESC

当我在T.idPartij中获得了ID时,此功能正常,但如前所述,该ID可以是null。在这种情况下,行不会出现在结果中。

唯一的问题:当我删除where子句时,我会得到很多行(因为Partij表格不再被过滤...

我是SQL的总菜鸟,所以我无法想出一种解决问题的方法。这个问题。我唯一能想到的就是创建2个查询,但我不认为这是一个很好的方法...

4 个答案:

答案 0 :(得分:4)

由于您尝试链接两个表,因此应使用LEFT OUTER JOIN代替:

SELECT T.idTaak,
       T.Taaktype,
       P.Partijnaam,
       T.Naar,
       T.UltimatumDatum,
       T.Opmerking,
       T.Status,
       T.Prioriteit
FROM Taak AS T LEFT OUTER JOIN Partij AS P
   ON T.idPartij = P.idPartij
ORDER BY idTaak DESC

如果您不想包含NULL值,请改用INNER JOIN

请注意,您不应使用这些旧式连接it's a bad habit to kick


根据NULL问题:

您无法使用= NULL<> NULL,因为NULL不等于或不等于任何内容。 NULL意味着未知。

因此请使用IS NULLIS NOT NULL

WHERE T.idPartij IS NULL OR T.idPartij = P.idPartij

来自MSDN

  

值为NULL表示该值未知。值为NULL   不同于空值或零值。没有两个空值   等于。两个空值之间或NULL与任意之间的比较   其他值,返回未知因为每个NULL的值未知。

答案 1 :(得分:2)

您没有指定数据库平台,因此使用ANSI语法是安全的。

coalesceP.idPartij时,T.idPartijnull进行比较:

where P.idPartij = coalesce(T.idPartij, P.idPartij)

如果TT.idPartij,则会匹配所有null行。

如果您想在TidPartij时不返回null行,请使用left outer join

from   Taak t
left
outer
join   Partij p
on     t.idPartij = p.idPartij

答案 2 :(得分:0)

您需要使用左连接来获取缺失的行,而不是内连接。

WHERE T.idPartij = P.idPartij OR T.idPartij IS NULL

答案 3 :(得分:0)

如果要连接表以便(a)非空等效ID匹配,并且(b)null Ids匹配,那么您的查询应该如下所示:

SELECT T.idTaak,
       T.Taaktype,
       P.Partijnaam,
       T.Naar,
       T.UltimatumDatum,
       T.Opmerking,
       T.Status,
       T.Prioriteit
FROM Taak AS T INNER JOIN Partij AS P
   ON T.idPartij = P.idPartij OR T.idPartij IS NULL AND P.idPartij IS NULL
ORDER BY idTaak DESC