我想用以下命令替换表中的值(1> -1)
更新table_name
设置column_name
=替换(column_name,' 1',' -1');
但是,我决定学习如何在Mysql中使用存储的程序,因为列数很大,并且有经常格式化的名称(' i01',' i02',.. )。 以下是我的试用版:
DELIMITER $$
DROP PROCEDURE IF EXISTS example$$
CREATE PROCEDURE example()
BEGIN
DECLARE p INT;
DECLARE str VARCHAR(20);
SET p = 1;
WHILE p < 100 DO
IF p <= 9 THEN SET str = CONCAT('i0', p);
ELSE SET str = CONCAT('i', p);
END IF;
UPDATE target_table
SET `str` = replace(str, '1', '-1');
SET p = p + 1;
END WHILE;
END$$
当我获取脚本时,可以调用该函数,然后出现ERROR 1054(42S22):未知列&#39; str&#39;在&#39;字段列表中。&#39; 如何在UPDATE查询中传递变量,在本例中为@str? 我在网上搜索,发现PREPARE可能是一个答案,但无法弄清楚如何在我的情况下使用它。
答案 0 :(得分:0)
是的,您使用PREPARE处于正确的轨道上..唯一的问题是您必须将查询字符串与字符串外部的变量名称连接以访问其内容。
SET @A = (SELECT CONCAT("UPDATE target_table SET `", @str, "` = replace(str, '1', '-1');"));
PREPARE qry FROM @A;
EXECUTE qry;
DEALLOCATE PREPARE qry;
如果您拥有的replace
与您的变量@str相关(因为您没有@符号,我不确定它是实际的列还是变量)那么您需要更改@一点点
SET @A = (SELECT CONCAT("UPDATE target_table SET `", @str, "` = replace(", @str, ", '1', '-1');"));
使用您的DECLARE,这应该是您的最终查询
DELIMITER $$
DROP PROCEDURE IF EXISTS example$$
CREATE PROCEDURE example()
BEGIN
DECLARE p INT;
DECLARE str VARCHAR(20);
DECLARE update_qry VARCHAR(200);
SET p = 1;
WHILE p < 100 DO
-- set up column name
IF p <= 9
THEN SET str = CONCAT('i0', p);
ELSE SET str = CONCAT('i', p);
END IF;
-- set up query to execute
SET update_qry = CONCAT("UPDATE target_table SET `", str, "` = replace(", str, ", '1', '-1');")
-- prepare execute and deallocate query
PREPARE qry FROM update_qry;
EXECUTE qry;
DEALLOCATE PREPARE qry;
-- increment counter for next column name
SET p = p + 1;
END WHILE;
END$$