Mysql存储过程忽略参数和WHERE条件

标签 mysql stored-procedures parameters

我有以下效果很好的:

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/

相关文章:

java - 如果存储过程在 MSSQL Server 2005 上的选择之前进行更新,则没有结果集

python - 将所有构造函数参数作为实例属性添加到 PyCharm 中的类

c - 将参数传递给 c 中的函数的一般方法

python /MySQL : Query executes but nothing happens?

在 docker 中为 alpine linux 安装 Mysql

MySQL 通过 group By 和排除查找平均 Timediff

MySQL 在终端中不工作,但可以连接到数据库并使用查询

sql-server - SQL Server 存储过程返回表,每个用户的唯一性计数

python - python中*args和**args的区别?

sql - 是否可以创建一个带有两个插入语句的存储过程,其中第一个插入语句中的 id/primary_key 将在第二个中使用?