sandman511
V2EX  ›  程序员

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

By sandman511 at 2020 年 4 月 30 日 · 3130 次点击
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 用在一起。
请问下大家 要实现这样的需求该怎么写?

谢谢回复

12 条回复  •  2020-04-30 11:07:25 +08:00
insert000
   1
insert000  
   2020 年 4 月 30 日 via iPhone
业务上实现,执行不同的 sql
xizismile
   2
xizismile  
   2020 年 4 月 30 日 via Android
楼上+1,建议业务上来实现。2020 以前的写一个 sql,2020 以后的写一个 sql,然后业务端去做聚合。都写到一个 sql 里,即使能写出来,那也是非常复杂的,后续迭代维护相当困难
liyanggyang
   3
liyanggyang  
   2020 年 4 月 30 日
楼上+1, 代码中实现业务。
再不济就$也是在代码中写动态 sql (不建议)
tankren
   4
tankren  
   2020 年 4 月 30 日
分开写啊
hanyingsen
   5
hanyingsen  
   2020 年 4 月 30 日
union all
sambawy
   6
sambawy  
   2020 年 4 月 30 日
SQL 不要写太复杂 增加维护难度
superrichman
   7
superrichman  
   2020 年 4 月 30 日
可以尝试用 where case when
crist
   8
crist  
   2020 年 4 月 30 日
if sql else sql
wangyanrui
   9
wangyanrui  
   2020 年 4 月 30 日
真心建议代码里面处理,不然后续接手的人肯定喷你(手动狗头)
来此一个曾经给人填过这种坑,并且骂骂咧咧的码农
Kylinsun
   10
Kylinsun  
   2020 年 4 月 30 日 via iPhone
根据业务拼接好 sql,写好注释
hbolive
   11
hbolive  
   2020 年 4 月 30 日
看到这个帖子,想起以前一个同事,以写复杂 SQL 代码为荣,能一句搞定的绝不两句,不管这个 SQL 多长。。
7654
   12
7654  
   2020 年 4 月 30 日
楼主这个需求 union 起来最方便
@hbolive #11 汗,遇见过 600 多行的 SQL,case when decode 等等函数不计其数
select *,(select *) from xx;select * from (select)嵌了不知道有多少
一点点理清头大
还是倾向于业务面处理原始数据,数据可以适量加工,但是不能包办一切
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
© 2026 V2EX · 117ms · 3.9.8.5