sql-加入时如果未找到匹配项,则使用默认值

voj3qocg  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(251)

我有一张这样的table。

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的数据。

例如:

从表b中,
对于id 1,我有3行,但是我需要选择timestamp>tablea.eventtime所在的行
所以呢 2 | 1 | 2020-05-02 04:11:00 | N 对于ID2,时间戳值小于表的事件时间,所以跳过这个。
所以选定的行是, 2 | 1 | 2020-05-02 04:11:00 | N 对于ID4,没有eventtime,实际上,表a上没有ID4的行。所以现在我需要传递一个默认的时间戳。就是这样 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

我写这个逻辑的时候卡住了?有人能帮我吗?

lx0bsm1f

lx0bsm1f1#

我想这正是你想要的:

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);
wljmcqd8

wljmcqd82#

您可以在查询中使用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

相关问题