【问题标题】:Conditionally showing part of a query in MySQL stored procedure有条件地显示 MySQL 存储过程中查询的一部分
【发布时间】:2018-02-27 09:51:39
【问题描述】:

我有一个在 php 中构建的 MySQL 查询,但想移动到存储过程中。整个查询都可以移到存储过程中,除了一个复杂的问题:在 php 中,根据条件,我添加一个“HAVING ......”作为最后一行。是否可以做一个条件、案例等以类似的方式构建查询?

例如:

PROCEDURE `GeyMyItems`(
    IN query VARCHAR(100)
    )
  BEGIN
    SELECT * FROM my_table a
    JOIN another_table b ON a.id = b.id
    WHERE my_column = 'this_value'

    IF (query = 'abc')
       HAVING a.my_value = '123';

  END$$

DELIMITER ;

我知道IF 的语法可能是错误的,但我只是在展示我正在尝试做的事情。有没有更好的方法来做到这一点?

我能想到的唯一退路可能是处理 php.ini 中的HAVING 部分。只是根本不将它包含在 SQL 中,当我构建我的对象/数组时,我可以在我的 while 循环中过滤。但我想看看如何将存储过程用于这样的事情,如果有的话?

【问题讨论】:

    标签: mysql sql stored-procedures conditional


    【解决方案1】:

    如果您使用的是 MySQL 5.0 及更高版本,这很容易。

    DELIMITER $$ 
    
    CREATE PROCEDURE `GetMyItems`(
        IN query VARCHAR(100)
        )
      BEGIN
        -- Here you construct your SQL
        SET @s = 'SELECT 1';
    
        IF query = 'abc' THEN
           SET @s = CONCAT( @s, ',2');
        END IF;
    
        -- Here you execute it.     
        PREPARE stmt FROM @s;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    
      END$$
    
    DELIMITER ;
    

    这是a similar question here

    【讨论】:

    • 是的,这完全有道理。通过变量构建查询。然后在最后执行。
    【解决方案2】:

    在你的 where 子句中添加:

    and 
    (
    (query = 'abc' and a.my_value ='123')
    or query <> 'abc'
    )
    

    【讨论】:

    • 对简单的条件句有意义。
    • 要处理 query 为 null 的用例,您应该使用 "or ifnull(query,'') != 'abc'"。
    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2022-12-13
    • 2016-11-19
    • 2023-03-26
    相关资源
    最近更新 更多