sql - Join 子句中的 SQL Case 表达式
问题描述
我有2张桌子如下
表格1
id | date
------+---------------------
1 | 1/12/2017
1 | 3/12/2017
1 | 10/2/2018
1 | 10/4/2018
2 | 1/7/2018
2 | 12/9/2018
2 | 13/9/2018
2 | 1/10/2018
表2
id | date1 | date2 | value
------+----------------+--------------+----------
1 | 1/1/2018 | 1/1/2018 | 1
1 | 15/2/2018 | 1/1/2018 | 4
1 | 10/4/2018 | 15/2/2018 | 7
2 | 1/7/2018 | 1/7/2018 | 5
2 | 13/9/2018 | 1/7/2018 | 2
2 | 1/10/2018 | 13/9/2018 | 14
我想将值列添加到表 1,按 id 匹配,如果日期在 date1 和 date 2 之间。但是,在 date1 = date2 的情况下,条件应该是日期在 date1 上或之前
结果应该是
id | date | value
------+-----------------+---
1 | 1/12/2017 | 1
1 | 3/12/2017 | 1
1 | 10/2/2018 | 4
1 | 10/4/2018 | 7
2 | 1/7/2018 | 5
2 | 12/9/2018 | 2
2 | 13/9/2018 | 2
2 | 1/10/2018 | 14
我尝试了以下 SQL 查询
SELECT table1.id, table1.date, table2.value
FROM table1
LEFT JOIN table2 ON (table1.id = table2.id AND
CASE
WHEN table2.date1 = table2.date2 THEN table1.date <= table2.date
ELSE table1.date BETWEEN table2.date2 AND table2.date1 );
和
SELECT table1.id, table1.date, table2.value
FROM table1
LEFT JOIN table2 ON (table1.id = table2.id) WHERE
CASE
WHEN table2.date1 = table2.date2 THEN table1.date <= table2.date
ELSE table1.date BETWEEN table2.date2 AND table2.date1;
但这并没有给出我需要的结果。我在哪里犯错
解决方案
你不需要一个case
。只是布尔条件,这些都可以放在ON
子句中:
SELECT t1.id, t1.date, t2.value
FROM table1 t1 JOIN
table2 t2
ON t1.id = t2.id AND
((t2.date1 < t2.date2 AND
t1.date BETWEEN t2.date1 AND t2.date2)
) OR
(t2.date1 = t2.date2 AND
t1.date <= t2.date1
)
);
您也可以简化这一点。一种方法是:
ON t1.id = t2.id AND
t1.date <= date2 AND
(t2.date1 = t2.date2 OR
t1.date >= t2.date1
);
推荐阅读
- amazon-web-services - 我应该在 cassandra.yaml 中为 broadcast_rpc_address 使用什么地址
- hibernate - 使用 Spring Boot 重新创建 Twitter 涉及的问题
- bamboo - 在单个命令中抑制 ERRORLEVEL
- python - 使用正则表达式进行多项选择
- javascript - 组件不会在地图功能上呈现
- chisel - 凿子模块的接线顺序
- swift - 如何从枚举中检索关联值
- javascript - 设置要运行的 NodeJS 脚本的计划作业
- django - 无法在 IIS 中安装“用于 iis 和 python 2.7.9 的 wfastcgi 2.1 网关”
- git-extensions - 如何清除 GitExtensions 中的分支下拉菜单