有条件地显示 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'
)
我在 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'
)