我有以下效果很好的:
SET @param = '%string%';
SELECT *
FROM tbl
WHERE IF(@param IS NOT NULL, LIKE @param, TRUE);
但是当我更改为:
DELIMITER //
CREATE PROCEDURE test(IN param VARCHAR(255))
BEGIN
SET @param = param;
SELECT *
FROM tbl
WHERE IF(@param IS NOT NULL, LIKE @param, TRUE);
END //
DELIMITER ;
CALL test('%string%');
所有行都会返回,就像没有传入参数一样。
我认为 MySQL 存在一些我遗漏的限制或限制?
最佳答案
不确定,但请尝试使用准备好的声明
DELIMITER //
CREATE PROCEDURE test(IN param VARCHAR(255))
BEGIN
SET @param = param;
SET @q = CONCAT("SELECT *
FROM tbl
WHERE IF(",@param," IS NOT NULL, LIKE ",@param,", TRUE)");
PREPARE stmt FROM @q;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
关于Mysql存储过程忽略参数和WHERE条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22076091/