当 运行 准备带有 if 条件的语句时出现 1064 错误

I got 1064 error when running prepare statement with if condition

DROP PROCEDURE IF EXISTS `test_proc`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `test_proc`(param_a int)
BEGIN
set @sqlstr_3=concat('if (1=',param_a,') then ');
set @sqlstr_3=concat(@sqlstr_3, 'select 1;else select 2;');
set @sqlstr_3=concat(@sqlstr_3, ' end if;');
select @sqlstr_3;
/**
prepare stmt_3 from @sqlstr_3;
execute stmt_3;
deallocate prepare stmt_3;
*/
if (1=param_a) then select 1;else select 2; end if;
END
;;
DELIMITER ;

当我调用此过程时使用:调用 test_proc(2) ,它工作正常并且 returns 两个结果:
结果 1: if (1=2) then select 1;else select 2;如果结束;
结果 2: 2

但是当我使用 prepare statement.It 时出现错误。

DROP PROCEDURE IF EXISTS `test_proc`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `test_proc`(param_a int)
BEGIN
set @sqlstr_3=concat('if (1=',param_a,') then ');
set @sqlstr_3=concat(@sqlstr_3, 'select 1;else select 2;');
set @sqlstr_3=concat(@sqlstr_3, ' end if;');
select @sqlstr_3;

prepare stmt_3 from @sqlstr_3;
execute stmt_3;
deallocate prepare stmt_3;

-- if (1=param_a) then select 1;else select 2; end if;
END
;;
DELIMITER ;

我调用这个过程使用:调用 test_proc(2) ,它有一些错误:

[Err] 1064 - 你的 SQL 语法有错误;查看与您的 MySQL 服务器版本对应的手册,了解在第 1

行 'if (1=2) then select 1;else select 2; end if' 附近使用的正确语法

你能帮我解决这个问题吗?

如果复合语句需要使用动态SQL,则必须将其转换为单语句。例如,您的

if (1=param_a) then select 1;else select 2; end if;

可能会转换成接近

的东西
select 1 WHERE (1=param_a)
UNION ALL
select 2 WHERE NOT (1=param_a);

或者,您可以使用单独的条件块来创建单独的 SQL 语句(甚至可能是 PREPARE):

IF 1=param_a THEN
    set @sqlstr_3='select 1;';
ELSE
    set @sqlstr_3='select 2;';
END IF;

PREPARE stmt_3 FROM @sqlstr_3;
EXECUTE stmt_3;
DROP PREPARE stmt_3;