SQL-如果找不到匹配项,则在加入时使用默认值

时间:2020-06-10 13:35:28

标签: sql postgresql join

我有这样的表A。

id | eventtime
--------------
1 | 2020-05-01 10:00:12
2 | 2020-04-03 04:04:23
3 | 2020-06-01 00:01:00

表B

qid|id | timestamp           | status
-------------------------------------
1  | 1 | 2020-04-03 01:00:00 | Y
2  | 1 | 2020-05-02 04:11:00 | N
3  | 2 | 2020-04-02 03:00:00 | Y
4  | 4 | 2020-06-01 01:00:00 | N
5  | 4 | 2020-06-03 01:00:00 | Y

我想加入这些表,但是当时间戳大于表A的事件时间时,它应该返回表'B的数据。

EG:

在表B中,

对于id 1,我有3行,但是我需要选择timestamp> tableA.eventtime

中的行

所以2 | 1 | 2020-05-02 04:11:00 | N

对于ID 2,时间戳记值小于tableA的事件时间,因此请跳过该事件。

所以选定的行是2 | 1 | 2020-05-02 04:11:00 | N

对于ID 4,没有事件时间,实际上,表A上没有ID 4的行。因此,现在我需要为此传递默认时间戳。那就是2020-06-02 00:00:00

所以选定的行是5 | 4 | 2020-06-03 01:00:00 | Y

预期输出:

qid|id | timestamp           | status
-------------------------------------
2  | 1 | 2020-05-02 04:11:00 | N
5  | 4 | 2020-06-03 01:00:00 | Y

在为此编写逻辑时被卡住了吗?有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

我认为这可以满足您的需求

select b.*
from b left join
     a
     on a.id = b.id 
where b.timestamp > coalesce(a.eventtime, '2020-06-02 00:00:00'::timestamp);

答案 1 :(得分:0)

您可以在查询中使用CASE语句。

SELECT B.*
  FROM B LEFT JOIN A ON A.ID = B.ID
 WHERE CASE
          WHEN B.TIMESTAMP >
                  CASE
                     WHEN A.EVENTTIME IS NULL
                     THEN
                        TO_DATE ('20200602', 'YYYYMMDD')
                     WHEN A.EVENTTIME IS NOT NULL
                     THEN
                        A.EVENTTIME
                  END
          THEN
             1
          ELSE
             0
       END = 1
相关问题