如何在存储过程的准备语句中包含条件逻辑

How to include conditional logic in a prepared statement in a Stored Procedure

我们有一个 MySql 存储过程,其中包括以下内容:

 SET @queryString = (SELECT CONCAT("UPDATE Table2 t ",
 "JOIN vTable1 v ",
"ON t.id.=v.id ",
 "SET t.sub_id_track = 1, t.prefix = '", newPrefix,"',",
 " t.sub_id = ", vIndex,
 ";"));
 
 PREPARE update_sql FROM @queryString;

 EXECUTE update_sql;

这个效果很好。

我们现在需要对其进行更改,以便

如果 newPrefix 包含任何值,则

SET t.sub_id_track = 1

但如果 newPrefix 为 null 或空,则

SET t.sub_id_track = 0

正确的做法是什么?

谢谢

首先,我有几点意见:

  • 您准备的查询存在 SQL 注入漏洞。
  • 您没有理由首先要运行将此作为准备好的查询。

我建议这个替代方案:

UPDATE Table2 t
JOIN vTable1 v ON t.id = v.id
SET t.sub_id_track = IFNULL(NULLIF(newPrefix, ''), 1, 0), 
    t.prefix = newPrefix, 
    t.sub_id = vIndex;

不需要 PREPARE/EXECUTE。没有 SQL 注入漏洞。它会处理您描述的条件。

但我想知道您是否打算在其中添加一个 WHERE 子句?这会将 UPDATE 应用到每一行。