【问题标题】:SQL - while joining if matching not found then use default valueSQL - 如果未找到匹配则加入时使用默认值
【发布时间】:2020-06-10 13:35:28
【问题描述】:

我有这样的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 行,但我需要选择时间戳> 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

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

【问题讨论】:

  • 请用您尝试过的查询更新您的问题

标签: sql postgresql join


【解决方案1】:

我认为这是你想要的:

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

【讨论】:

  • 嘿@gordon-linoff 只是一个想法,如果我只给出b.timestamp > coalesce(a.eventtime, '2020-06-02 00:00:00'::timestamp) 而不是OR 操作,它会工作吗?
  • @Bhuvanesh。 . .是的。我不知道为什么我把orcoalesce() 放在一起。两者都可以,但coalesce() 更简单。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-01
    • 2019-11-24
    • 2015-12-02
    • 1970-01-01
    • 2016-04-24
    • 2019-04-12
    • 2013-02-25
    • 2010-11-22
    相关资源
    最近更新 更多