首页 > 解决方案 > 仅当值存在时,如何从带有 WHERE 子句的连接表中进行选择?

问题描述

我想从 table1 (WHERE t1.id = 1) 中选择一条记录,然后将 table2 和 table3 (t2.field2 和 t3.field3) 加入到 table1 但仅当值存在时(IS NOT NULL)。

例如,如果 t3.field3 的值不存在,则不会为该表显示 field3 列...

   t1

 id  |  field1
---------------
 1   |   f1val
 2   |   f1val
 3   |   f1val


       t2

 id(fk)  |  field2
-------------------
 1       |   f2val
 2       |   null
 3       |   null


       t3

 id(fk)  |  field3
-------------------
 1       |   null
 2       |   f3val
 3       |   f3val

我试图做的代码是这样的:

    SELECT t1.id, t2.field1, t3.field3
    FROM (
       SELECT t1.id
       FROM t1
       WHERE t1.id = 1
    )
   LEFT JOIN t2 ON t2.id = t1.id AND t2.id is not null
   LEFT JOIN t3 ON t2.id = t1.id AND t3.id is not null;

从上面的查询返回的连接表如下所示:

 id  |  field2  | field3
----------------------------
  1  |   f1val  |  null

但是,由于 field3 为空,我希望它只返回 id 和 field2,如下所示:

  id  |  field2  
----------------
   1  |  f1val 

您的帮助将不胜感激。

标签: sqlpostgresqljoinwhere-clause

解决方案


可以返回一列,使用coalesce()

SELECT t1.id, COALESCE(t2.field1, t3.field3) as field_2_3
FROM t1 LEFT JOIN
     t2 
     ON t2.id = t1.id LEFT JOIN
     t3
     ON t3.id = t1.id
WHERE t1.id = 1;

但是,您有时不能返回 2 列,有时不能返回 3 列。

笔记:

  • 子查询t1完全没有必要。您可以只在单个WHERE子句中应用过滤器。
  • 的比较IS NOT NULL是不必要的,因为它们JOIN无论如何都不符合条件。
  • 最后一个JOIN条件大概是 on t3.id = t1.id

推荐阅读