首页 > 解决方案 > SQL - 如果未找到匹配则加入时使用默认值

问题描述

我有这样的表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 数据。

例如:

从表 B,

对于 id 1 我有 3 行,但我需要选择时间戳> tableA.eventtime 的行

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

对于 id 2,timestamp 值小于 tableA 的事件时间,所以跳过这个。

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

对于 id 4,没有 eventtime,事实上,表 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

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

标签: sqlpostgresqljoin

解决方案


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

推荐阅读