sql - 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
我在为此编写逻辑时卡住了?有人可以帮我吗?
解决方案
您可以在查询中使用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
推荐阅读
- javascript - 悬停时显示图像
- docker - 用于多个应用程序的 docker 文件?
- ios - 无法在真实设备上构建 Xcode 项目
- azure-devops - 如何在进行容量规划时找到共享资源分配 - Azure Devops
- c# - 将两个 fileinfo[] 加在一起
- python - 我成功发布了一个名为 virtualp 的 python 包。但是当我安装包时它会抛出错误
- angular - 如何从 API 接收数据,其中包含 Angular 8 中的密钥和标头
- angular - Jest 测试套件无法运行 AngularJS v1.x 未加载!将角度 7 升级到 9 后
- lookup - 无字节交换的大端CRC计算
- locust - Locust RPS 值不正确#LOCUST # rpsissue