V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yehoha
V2EX  ›  程序员

重构-过多 if 语句重构问题

  •  
  •   yehoha · 2018-10-31 18:28:29 +08:00 · 3423 次点击
    这是一个创建于 2244 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位 v2 好,有一个动态 sql 语句,查询参数有 100 个以上。在拼接的时候每个参数都要判断一次是否为空,然后再拼接上去,请问各位啥重构优化的好思路吗?
    21 条回复    2018-11-01 08:46:58 +08:00
    TommyLemon
        1
    TommyLemon  
       2018-10-31 18:44:53 +08:00
    封装方法,为空不拼接,或者拼接空字符串。
    不过你也可以试试 APIJSON, key: value 中 value 为空是不会拼接 SQL 的。

    🚀后端接口和文档自动化,前端(客户端) 定制返回 JSON 的数据和结构!
    https://github.com/TommyLemon/APIJSON
    lovedebug
        2
    lovedebug  
       2018-10-31 18:47:19 +08:00 via Android
    拆分成子查询。。一次性查这么多不怕数据库爆炸吗
    yehoha
        3
    yehoha  
    OP
       2018-10-31 18:51:55 +08:00
    @lovedebug 实际使用中也就 5,6 个,最多也就输入 10 几个查询条件。不会爆炸
    rbe
        4
    rbe  
       2018-10-31 18:53:52 +08:00
    如果参数来自接口的话,你需要的应该是 JSON Schema 校验的库吧,定义好需要的参数类型、格式之类的,自动校验。
    yehoha
        5
    yehoha  
    OP
       2018-10-31 18:55:55 +08:00
    @rbe 无论来自哪里 最后拼接操作总要判断一次吧?空就跳过这个条件。
    cyssxt
        6
    cyssxt  
       2018-10-31 19:03:41 +08:00 via iPhone
    最多抽一个方法 减少 if 的个数 但是本质上没有什么作用 只是看得舒服点 意义不大
    jswh
        7
    jswh  
       2018-10-31 19:06:56 +08:00
    这种,列一个参数表数组,然后用循环。
    或者全部尝试着取一下成为<k,v>对,取不到 v 就是空。然后过滤空项目,剩下的就拼起来。
    akira
        8
    akira  
       2018-10-31 19:20:43 +08:00
    7l 的方法应该就是最好的了,然后还可以扩充一下,做成更通用的方法
    luozic
        9
    luozic  
       2018-10-31 19:26:46 +08:00 via iPhone   ❤️ 1
    表驱动,关键你这么多参数连接查询,为啥不上虚拟表?
    yehoha
        10
    yehoha  
    OP
       2018-10-31 19:26:51 +08:00
    @jswh 感谢回答。比如说过滤后剩下五个不为空,那么拼接的时候也存在问题的吧?因为要根据每个字段,后面拼接的内容都不一样。
    luozic
        11
    luozic  
       2018-10-31 19:28:39 +08:00 via iPhone
    @luozic 说错了 是复合类型。
    xiaoxinshiwo
        12
    xiaoxinshiwo  
       2018-10-31 19:28:56 +08:00
    yehoha
        13
    yehoha  
    OP
       2018-10-31 19:33:18 +08:00
    @xiaoxinshiwo if 全部是并列的 和箭头型不一样。
    luozic
        14
    luozic  
       2018-10-31 19:35:01 +08:00 via iPhone
    就是不能用 Postgresql ? 那就用代码上策略模式 或者表驱动。 最牛的当然是直接上个状态机,整个 dsl 随便玩。
    yehoha
        15
    yehoha  
    OP
       2018-10-31 19:35:16 +08:00
    @luozic 表驱动 看了下 貌似可行啊
    yehoha
        16
    yehoha  
    OP
       2018-10-31 19:38:27 +08:00
    @luozic oracle 数据库是不可能改的。策略模式不适用这种吧?我看到 4,5 种策略就要改混合模式,已经算策略膨胀问题了
    luozic
        17
    luozic  
       2018-10-31 19:43:32 +08:00 via iPhone
    Java 没有模式匹配… scala 和 c#都有
    rayhy
        18
    rayhy  
       2018-10-31 19:45:49 +08:00 via Android
    [<field, sql, used>…] 这样的一个 list 可以吗? field 就是要查询的参数,sql 就是要拼接的语句,used 就是是否拼接,然后循环遍历一遍表确定 used 值,再遍历一边拼接成 SQL。
    yehoha
        19
    yehoha  
    OP
       2018-10-31 20:07:41 +08:00 via Android
    @rayhy 恩恩 这个就和表驱动类似
    x66
        20
    x66  
       2018-10-31 23:08:07 +08:00
    @luozic #14 Postgresql 有什么好的方式可以处理?
    annielong
        21
    annielong  
       2018-11-01 08:46:58 +08:00
    不用判断就用遍历,反正不管哪种都要把条件跑一遍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5634 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 01:39 · PVG 09:39 · LAX 17:39 · JFK 20:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.