【发布时间】:2017-08-28 04:57:09
【问题描述】:
我有一组关键字,我想在表格的列中更改它们出现的位置。所以有一个主表和关键字表,它有 2 列:要查找的关键字和将其更改为的内容。因此,例如,有一行
findtxt repltxt LTD$有限公司
然后我有一个程序,其中引用的重要部分如下:
DECLARE cur1 CURSOR FOR SELECT findtxt,repltxt FROM keywords ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
SET done = 0;
OPEN cur1;
myLoop: LOOP
FETCH cur1 INTO ftxt,rtxt;
IF done = 1 THEN
LEAVE igmLoop;
END IF;
SET @t1 = CONCAT('UPDATE ',tbl,' SET ',sanecol,' = REPLACE(',sanecol,',?,','?) WHERE ',sanecol,' REGEXP ?');
PREPARE stmt FROM @t1;
SET @ftxt = ftxt;
SET @rtxt = rtxt;
EXECUTE stmt USING @ftxt,@rtxt,@ftxt;
DEALLOCATE PREPARE stmt;
END LOOP myLoop;
CLOSE cur1;
sanecol 和 tbl 作为参数传递到表示要更改的列和具有该列的表的过程中。
此过程循环运行所有记录(我知道是因为它需要一段时间),但没有错误结束。然而关键字并没有改变(例如 LTD 不会变成 LIMITED。)
我做错了什么?
我已经测试通过
来隔离问题SET @t2 = CONCAT('UPDATE ',tbl,' SET idd = 1 WHERE ',sanecol,' REGEXP ?');
其中 idd 只是为确保 REGEXP 正常工作而创建的测试标志。它确实是通过将 LIM 或 LTD 的每条记录的 idd 列设置为 1。
所以问题出在这部分代码上:
CONCAT('UPDATE ',tbl,' SET ',sanecol,' = REPLACE(',sanecol,',?,','?)
替换只是不起作用。
表中要替换的样本数据
id replacecol
1 FOREVER UNITED LTD
2 APPLE DEVICES LIMITED
3 QUICKFIX DESIGNS LIM
4 FINANCIAL TIMES LTD
这应该改为:
id replacecol
1 FOREVER UNITED LIMITED
2 APPLE DEVICES LIMITED
3 QUICKFIX DESIGNS LIMITED
4 FINANCIAL TIMES LIMITED
【问题讨论】:
-
我怀疑您的根本问题是您将关键字存储为分隔列表,而不是存储在每个关键字一行的表中。
-
它在表格中:我已编辑添加屏幕截图。
-
你认为像“BEAUTI SLIM”这样的名字会发生什么?也许是“BEAUTI SLIMITED”?
-
那些将被忽略,因为在关键字表中 LIM$ 和 LTD$ 之前有一个空格。我现在可以接受这种治疗。
标签: mysql regex stored-procedures replace prepared-statement