【问题标题】:How to handle complex conditional where clauses in mysql如何处理mysql中复杂的条件where子句
【发布时间】:2015-03-16 23:34:11
【问题描述】:

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

可以使用 CASE 语句将所有逻辑构建到 where 子句中,但我猜这不会得到很好的优化?我知道我可以在存储过程中动态构建 sql 语句,并且我也可以使用准备好的语句……但这似乎很草率?还有其他我没有想到的方法吗?

【问题讨论】:

  • 这个用户输入是如何进入图片的?这是在带有 php 后端的网页的上下文中,还是什么...? WHERE 子句是否仅包含 WHERE MY_PROCEDURE(user_input) = true 并且您将所有逻辑嵌入到过程中以返回真/假?
  • 通过网页,asp/vb后端。我不清楚您的建议...目标是执行带有许多条件 where 子句的选择查询。

标签: mysql stored-procedures prepared-statement


【解决方案1】:

通常的方法是在处理用户输入的层中动态构建查询。如果您在数据库前不使用高级语言,这意味着确实要使用存储过程,这可能看起来确实有点脏 - 我也觉得这种语言很尴尬。

纯 SQL 解决方案没有太多开销,因为基于常量的条件将被非常有效地优化掉(查询开始时用户输入是常量)。

【讨论】:

    【解决方案2】:

    我通常使用绑定变量和条件查询来完成您正在做的事情,如下所示:

    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 语句来做同样的事情。

    【讨论】:

      【解决方案3】:

      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>
      

      【讨论】:

        猜你喜欢
        • 2010-12-27
        • 2013-08-29
        • 2011-01-12
        • 2013-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        相关资源
        最近更新 更多