如何在mysql中处理复杂的条件where子句

时间:2015-03-16 23:34:11

标签: mysql stored-procedures prepared-statement

基于各种可选的用户输入,我需要修改查询中where子句的结构(不仅仅是动态值,而是动态结构)。
示例..如果他们选择customerID,则不使用branchID过滤器,但如果他们选择empID,则使用empID和branchID过滤器。还有更多使用的标准,这只是一个例子。

可以使用CASE语句将所有逻辑构建到where子句中,但我猜这不会很好地优化?我知道我可以在存储过程中动态构建sql语句,我也可以使用预处理语句......但这看起来很草率?还有其他我没想到的方法吗?

3 个答案:

答案 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>