当左连接时,列.name = null不返回行

时间:2014-02-03 18:59:01

标签: android sql sqlite

当我这样做时:

SELECT tabuoj.id, tabuoj.tabuo, montritaj_tabuoj.id, montritaj_tabuoj.id_de_tabuo 
    FROM tabuoj LEFT JOIN montritaj_tabuoj 
    ON (tabuoj.id=montritaj_tabuoj.id_de_tabuo)

我明白了:

id | tabuo    | id   | id_de_tabuo | 
 1 | dom      | 2    |     1       | 
 2 | samochód | null |    null     | 
 3 | okno     | 1    |     3       | 

但如果我添加将id_de_tabuo列与null进行比较的位置,我就不会得到任何结果。

SELECT tabuoj.id, tabuoj.tabuo, montritaj_tabuoj.id, montritaj_tabuoj.id_de_tabuo 
FROM tabuoj LEFT JOIN montritaj_tabuoj 
ON (tabuoj.id=montritaj_tabuoj.id_de_tabuo) 
WHERE montritaj_tabuoj.id_de_tabuo=null

如果我比较这样的例子1:

SELECT tabuoj.id, tabuoj.tabuo, montritaj_tabuoj.id, montritaj_tabuoj.id_de_tabuo 
FROM tabuoj LEFT JOIN montritaj_tabuoj 
ON (tabuoj.id=montritaj_tabuoj.id_de_tabuo) 
WHERE montritaj_tabuoj.id_de_tabuo=1

我说得对:

id | tabuo    | id   | id_de_tabuo | 
 1 | dom      | 2    |     1       | 

但我需要在id_de_tabuo列中使用null的行。我做错了什么?

3 个答案:

答案 0 :(得分:4)

尝试使用IS NULL代替= null这样的

SELECT tabuoj.id, tabuoj.tabuo, montritaj_tabuoj.id, montritaj_tabuoj.id_de_tabuo 
FROM tabuoj LEFT JOIN montritaj_tabuoj 
ON (tabuoj.id=montritaj_tabuoj.id_de_tabuo) 
WHERE montritaj_tabuoj.id_de_tabuo is null

原因:实际上

montritaj_tabuoj.id_de_tabuo is null检查该值是否为空。而
montritaj_tabuoj.id_de_tabuo = null检查该值是否等于NULL,这是永远不会的。

即使 NULL也不等于NULL 。你可以用它来检查。

if(null = null)
  print 'equal'
else
  print 'not equal'

它会打印not equal。现在试试这个

if(null is null)
  print 'equal'
else
  print 'not equal'

它会打印equal

答案 1 :(得分:0)

当您在where子句中对左连接表进行过滤时,连接将成为内连接。要解决这个问题,请在from子句中进行过滤,如下所示:

FROM tabuoj LEFT JOIN montritaj_tabuoj 
ON (tabuoj.id=montritaj_tabuoj.id_de_tabuo)   
and montritaj_tabuoj.id_de_tabuo is null

where clause starts here

答案 2 :(得分:0)

尝试两个简单的选择,如

select * where id = null

select * where id != null

这是关于null的常见误解。 认为null是英语单词“what”,反对“没有”,你开始更好地理解它。

当sachim回答使用时

IS NULL

关于你的谓词。