在 Postgres JOIN 查询中区分 null 和 empty

Posted

技术标签:

【中文标题】在 Postgres JOIN 查询中区分 null 和 empty【英文标题】:Differentiate null and empty in Postgres JOIN query 【发布时间】:2017-03-27 23:14:39 【问题描述】:

如果我有这样的表格:

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 是否存在而无需单独的查询。这可能吗?

【问题讨论】:

你试过OUTER JOIN 和表 t1 吗?这将返回 t1 中的所有记录 【参考方案1】:

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语法。

【讨论】:

你的意思是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;(第二个左连接)。另外,您是否建议不要像我在原始问题中那样通过WHERE 子句执行JOIN @Newtang 。 . . FROM 子句中的逗号已经过时了 20 多年。 我理解FROM 的评论,谢谢。我在询问正确的明确 JOIN 部分。

以上是关于在 Postgres JOIN 查询中区分 null 和 empty的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++ 中区分大小写的短语搜索

仅基于表的一个字段在 Linq 中区分

如何在 Web 应用程序中区分用户

如何对具有纪元值的列进行 JOIN 查询,忽略 postgres 中的时间部分

只有 JOIN 在 postgres 中意味着啥? [复制]

SQL中的join连接查询