V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sandman511
V2EX  ›  程序员

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

  •  
  •   sandman511 · 2020-04-30 09:54:52 +08:00 · 2211 次点击
    这是一个创建于 1667 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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-04-30 09:56:54 +08:00 via iPhone
    业务上实现,执行不同的 sql
    xizismile
        2
    xizismile  
       2020-04-30 10:03:57 +08:00 via Android
    楼上+1,建议业务上来实现。2020 以前的写一个 sql,2020 以后的写一个 sql,然后业务端去做聚合。都写到一个 sql 里,即使能写出来,那也是非常复杂的,后续迭代维护相当困难
    liyanggyang
        3
    liyanggyang  
       2020-04-30 10:08:41 +08:00
    楼上+1, 代码中实现业务。
    再不济就$也是在代码中写动态 sql (不建议)
    tankren
        4
    tankren  
       2020-04-30 10:21:59 +08:00
    分开写啊
    hanyingsen
        5
    hanyingsen  
       2020-04-30 10:23:22 +08:00
    union all
    sambawy
        6
    sambawy  
       2020-04-30 10:27:55 +08:00
    SQL 不要写太复杂 增加维护难度
    superrichman
        7
    superrichman  
       2020-04-30 10:30:02 +08:00
    可以尝试用 where case when
    crist
        8
    crist  
       2020-04-30 10:31:31 +08:00
    if sql else sql
    wangyanrui
        9
    wangyanrui  
       2020-04-30 10:34:33 +08:00
    真心建议代码里面处理,不然后续接手的人肯定喷你(手动狗头)
    来此一个曾经给人填过这种坑,并且骂骂咧咧的码农
    Kylinsun
        10
    Kylinsun  
       2020-04-30 10:39:04 +08:00 via iPhone
    根据业务拼接好 sql,写好注释
    hbolive
        11
    hbolive  
       2020-04-30 10:56:42 +08:00
    看到这个帖子,想起以前一个同事,以写复杂 SQL 代码为荣,能一句搞定的绝不两句,不管这个 SQL 多长。。
    7654
        12
    7654  
       2020-04-30 11:07:25 +08:00
    楼主这个需求 union 起来最方便
    @hbolive #11 汗,遇见过 600 多行的 SQL,case when decode 等等函数不计其数
    select *,(select *) from xx;select * from (select)嵌了不知道有多少
    一点点理清头大
    还是倾向于业务面处理原始数据,数据可以适量加工,但是不能包办一切
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2948 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:05 · PVG 19:05 · LAX 03:05 · JFK 06:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.