一个 SQL 问题, where 子句如何不同情况用不同条件

2020-04-30 09:54:52 +08:00
 sandman511
SELECT * FROM T1,T2 
WHERE ((T1.DATE>=2020 AND T1.ID = T2.ID) OR
(T1.DATE < 2020 AND T1.NAME=T2.NAME(+) AND T1.AGE = T2.AGE(+) AND T1.GENDER=T2.GENDER(+)))

就是说 2020 年以后的数据 直接 ID 匹配
2020 以前的数据 用具体的信息匹配

关键是还要做左外连接,但是左外连接不能和 OR 用在一起。
请问下大家 要实现这样的需求该怎么写?

谢谢回复

2211 次点击
所在节点    程序员
12 条回复
insert000
2020-04-30 09:56:54 +08:00
业务上实现,执行不同的 sql
xizismile
2020-04-30 10:03:57 +08:00
楼上+1,建议业务上来实现。2020 以前的写一个 sql,2020 以后的写一个 sql,然后业务端去做聚合。都写到一个 sql 里,即使能写出来,那也是非常复杂的,后续迭代维护相当困难
liyanggyang
2020-04-30 10:08:41 +08:00
楼上+1, 代码中实现业务。
再不济就$也是在代码中写动态 sql (不建议)
tankren
2020-04-30 10:21:59 +08:00
分开写啊
hanyingsen
2020-04-30 10:23:22 +08:00
union all
sambawy
2020-04-30 10:27:55 +08:00
SQL 不要写太复杂 增加维护难度
superrichman
2020-04-30 10:30:02 +08:00
可以尝试用 where case when
crist
2020-04-30 10:31:31 +08:00
if sql else sql
wangyanrui
2020-04-30 10:34:33 +08:00
真心建议代码里面处理,不然后续接手的人肯定喷你(手动狗头)
来此一个曾经给人填过这种坑,并且骂骂咧咧的码农
Kylinsun
2020-04-30 10:39:04 +08:00
根据业务拼接好 sql,写好注释
hbolive
2020-04-30 10:56:42 +08:00
看到这个帖子,想起以前一个同事,以写复杂 SQL 代码为荣,能一句搞定的绝不两句,不管这个 SQL 多长。。
7654
2020-04-30 11:07:25 +08:00
楼主这个需求 union 起来最方便
@hbolive #11 汗,遇见过 600 多行的 SQL,case when decode 等等函数不计其数
select *,(select *) from xx;select * from (select)嵌了不知道有多少
一点点理清头大
还是倾向于业务面处理原始数据,数据可以适量加工,但是不能包办一切

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/667496

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX