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

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

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