有条件地显示 MySQL 存储过程中的部分查询

Conditionally showing part of a query in MySQL stored procedure

我在 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 中的 HAVING 部分。根本不要将它包含在 SQL 中,当我构建 object/array 时,我可以在 while 循环中过滤那里。但是我想看看如何利用存储过程来做这样的事情,如果有的话?

如果您使用的是 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

在您的 where 子句中添加:

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