基于各种可选的用户输入,我需要修改查询中where子句的结构(不仅仅是动态值,而是动态结构)。
示例..如果他们选择customerID,则不使用branchID过滤器,但如果他们选择empID,则使用empID和branchID过滤器。还有更多使用的标准,这只是一个例子。
我可以使用CASE语句将所有逻辑构建到where子句中,但我猜这不会很好地优化?我知道我可以在存储过程中动态构建sql语句,我也可以使用预处理语句......但这看起来很草率?还有其他我没想到的方法吗?
答案 0 :(得分:0)
通常的方法是在处理用户输入的图层中动态构建查询。如果你不在数据库前使用高级语言,这意味着确实使用存储过程,这看起来确实有点脏 - 我也觉得这种语言很尴尬。
纯SQL解决方案没有太多的开销,因为基于常量的条件将非常有效地优化(用户输入在查询开始时是常量)。
答案 1 :(得分:0)
我通常使用绑定变量和条件查询完成您正在做的事情,如下所示:
SELECT ...
FROM table
WHERE ...(put your where clause elements common to both cases here)
AND ((? = 'value1'
AND ...
AND ...
) OR
(? = 'value2'
AND ...
AND ...
))
GROUP BY ...
ORDER BY ...
?
是MySQL的绑定变量语法 - 参见清单23 here的小例子。在这种情况下,绑定变量1和2实际上将设置为相同的值。
您也可以使用CASE语句执行相同的操作。
答案 2 :(得分:-1)
mybatis动态sql可以帮助你。
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>