在Postgres JOIN查询中区分null和empty

时间:2017-03-27 23:14:40

标签: sql database postgresql join postgresql-9.4

如果我有这样的表:

t1:
 id | name 
----+------
  1 | a
  2 | b
  3 | c
  4 | d

t2:
 id | value 
----+-------
 10 | xxx
 20 | yyy
 30 | zzz

t_join:
 t1_id | t2_id 
-------+-------
     1 |    10
     2 |    20
     3 |    30

t1.id = 1的SELECT查询如下所示:

SELECT t1.id, t1.name, t2.value FROM t1, t2,t_join WHERE t1.id=t_join.t1_id AND t2.id=t_join.t2_id AND t1.id=1;

当然还有:

id | name | value 
----+------+-------
  1 | a    | xxx

如果我对id=4做同样的事情,我什么也得不到。

 SELECT t1.id, t1.name, t2.value FROM t1, t2,t_join WHERE t1.id=t_join.t1_id AND t2.id=t_join.t2_id AND t1.id=4;
 id | name | value 
----+------+-------
(0 rows)

而且,如果我用无意义的id=1234132做同样的事情,我也什么也得不到。

SELECT t1.id, t1.name, t2.value FROM t1, t2,t_join WHERE t1.id=t_join.t1_id AND t2.id=t_join.t2_id AND t1.id=1234132;
 id | name | value 
----+------+-------
(0 rows)

有没有办法可以区分空结果(id=4)与空结果(id=1234132)?我想我想验证我正在检查的id是否存在而没有单独的查询。这可能吗?

1 个答案:

答案 0 :(得分:2)

left join

怎么样?
SELECT t1.id, t1.name, t2.value
FROM t1 LEFT JOIN
     t_join
     ON t1.id = t_join.t1_id LEFT JOIN
     t2 
     ON t2.id = t_join.t2_id 
WHERE t1.id = 1;

如果找不到t.id,则不会获得任何行。如果t2中没有匹配项,那么您将获得NULL值。

另外,一个简单的规则:从不FROM子句中使用逗号。 始终始终使用正确的JOIN语法。