2014-11-06 54 views
1

我想替换的值(1> -1),其与下面的命令的表 UPDATE table_name SET column_name =取代(列名, '1', '-1') ;如何通过可变与UPDATE MySQL查询

但是,我决定学习如何在Mysql中使用存储的程序,因为列的数量与他们经常格式化的namesn('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):在“字段列表未知列 'STR' “。 如何传递变量,在这种情况下@str,更新查询内? 我在网上搜索,发现PREPARE可能是一个答案,但无法弄清楚如何在我的情况下使用。

回答

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(因为你没有@符号有我不知道,如果它的实际列或变量),那么你需要改变@A一点点

SET @A = (SELECT CONCAT("UPDATE target_table SET `", @str, "` = replace(", @str, ", '1', '-1');")); 

DEMO

你宣布这应该是你的最终查询

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$$ 
+0

非常感谢你 – 2014-11-06 17:59:42

+0

@YongWookShin当然可以!很高兴我可以帮助:)因为你很快就接受了答案,所以生病给你+1了!谢谢 – 2014-11-06 18:00:38

+0

我刚刚纠正了一点点>> SET @update_qry = CONCAT(“UPDATE jung_um SET'”,str,“'= replace(”,str,“,'2','1');”); PREPARE qry FROM @update_qry; – 2014-11-06 18:27:46