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

2018 年 10 月 31 日
 yehoha
各位 v2 好,有一个动态 sql 语句,查询参数有 100 个以上。在拼接的时候每个参数都要判断一次是否为空,然后再拼接上去,请问各位啥重构优化的好思路吗?
4526 次点击
所在节点    程序员
21 条回复
TommyLemon
2018 年 10 月 31 日
封装方法,为空不拼接,或者拼接空字符串。
不过你也可以试试 APIJSON, key: value 中 value 为空是不会拼接 SQL 的。

🚀后端接口和文档自动化,前端(客户端) 定制返回 JSON 的数据和结构!
https://github.com/TommyLemon/APIJSON
lovedebug
2018 年 10 月 31 日
拆分成子查询。。一次性查这么多不怕数据库爆炸吗
yehoha
2018 年 10 月 31 日
@lovedebug 实际使用中也就 5,6 个,最多也就输入 10 几个查询条件。不会爆炸
rbe
2018 年 10 月 31 日
如果参数来自接口的话,你需要的应该是 JSON Schema 校验的库吧,定义好需要的参数类型、格式之类的,自动校验。
yehoha
2018 年 10 月 31 日
@rbe 无论来自哪里 最后拼接操作总要判断一次吧?空就跳过这个条件。
cyssxt
2018 年 10 月 31 日
最多抽一个方法 减少 if 的个数 但是本质上没有什么作用 只是看得舒服点 意义不大
jswh
2018 年 10 月 31 日
这种,列一个参数表数组,然后用循环。
或者全部尝试着取一下成为<k,v>对,取不到 v 就是空。然后过滤空项目,剩下的就拼起来。
akira
2018 年 10 月 31 日
7l 的方法应该就是最好的了,然后还可以扩充一下,做成更通用的方法
luozic
2018 年 10 月 31 日
表驱动,关键你这么多参数连接查询,为啥不上虚拟表?
yehoha
2018 年 10 月 31 日
@jswh 感谢回答。比如说过滤后剩下五个不为空,那么拼接的时候也存在问题的吧?因为要根据每个字段,后面拼接的内容都不一样。
luozic
2018 年 10 月 31 日
@luozic 说错了 是复合类型。
xiaoxinshiwo
2018 年 10 月 31 日
yehoha
2018 年 10 月 31 日
@xiaoxinshiwo if 全部是并列的 和箭头型不一样。
luozic
2018 年 10 月 31 日
就是不能用 Postgresql ? 那就用代码上策略模式 或者表驱动。 最牛的当然是直接上个状态机,整个 dsl 随便玩。
yehoha
2018 年 10 月 31 日
@luozic 表驱动 看了下 貌似可行啊
yehoha
2018 年 10 月 31 日
@luozic oracle 数据库是不可能改的。策略模式不适用这种吧?我看到 4,5 种策略就要改混合模式,已经算策略膨胀问题了
luozic
2018 年 10 月 31 日
Java 没有模式匹配… scala 和 c#都有
rayhy
2018 年 10 月 31 日
[<field, sql, used>…] 这样的一个 list 可以吗? field 就是要查询的参数,sql 就是要拼接的语句,used 就是是否拼接,然后循环遍历一遍表确定 used 值,再遍历一边拼接成 SQL。
yehoha
2018 年 10 月 31 日
@rayhy 恩恩 这个就和表驱动类似
x66
2018 年 10 月 31 日
@luozic #14 Postgresql 有什么好的方式可以处理?

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

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

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

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

© 2021 V2EX