- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一组关键字,我想在表格的列中更改它们出现的位置。因此,有一个主表和关键字表,其中有 2 列:要查找的关键字以及将其更改为的内容。例如,有一行用于
findtxt repltxt 有限公司$ 有限公司
然后我有一个过程,其中重要部分引用如下:
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,',?,','?)
REPLACE 不起作用。
要替换的表中的示例数据
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
最佳答案
尝试如下:
mysql> DROP PROCEDURE IF EXISTS `sp_test`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP TABLE IF EXISTS `keywords`, `to_replace`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `to_replace` (
-> `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> `text` VARCHAR(255) NOT NULL
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `keywords` (
-> `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> `regexptxt` VARCHAR(255) NOT NULL,
-> `findtxt` VARCHAR(255) NOT NULL,
-> `repltxt` VARCHAR(255) NOT NULL
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO `to_replace` (`text`)
-> VALUES ('LTD$ AAAA'),
-> ('BBBB LIM$'),
-> ('AAAA LTD$ LIM$ BBBB'),
-> ('FOREVER UNITED LTD'),
-> ('APPLE DEVICES LIMITED'),
-> ('QUICKFIX DESIGNS LIM'),
-> ('FINANCIAL TIMES LTD'),
-> ('BEAUTI SLIM'),
-> ('FINANCIAL TIMES LTD & FOREVER UNITED LTD'),
-> ('FOREVER UNITED LTD & QUICKFIX DESIGNS LIM');
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> INSERT INTO `keywords`
-> (`regexptxt`, `findtxt`, repltxt)
-> VALUES
-> (' LTD$', 'LTD', 'LIMITED'),
-> (' LIM$', 'LIM', 'LIMITED');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> DELIMITER //
mysql> CREATE PROCEDURE `sp_test`(`tbl` VARCHAR(64), `sanecol` VARCHAR(64))
-> BEGIN
-> DECLARE `done` BOOL DEFAULT FALSE;
-> DECLARE `retxt`, `ftxt`, `rtxt` VARCHAR(255) DEFAULT '';
->
-> DECLARE `cur1` CURSOR FOR
-> SELECT `regexptxt`, `findtxt`, `repltxt`
-> FROM `keywords`;
->
-> DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` := TRUE;
->
-> OPEN `cur1`;
->
-> `myLoop`: LOOP
-> FETCH `cur1` INTO `retxt`, `ftxt`, `rtxt`;
-> IF `done` THEN
-> CLOSE `cur1`;
-> LEAVE `myLoop`;
-> END IF;
->
-> SET @`t1` = CONCAT('UPDATE `', `tbl`,'`
'> SET `', `sanecol`, '` = REPLACE(`', `sanecol`, '`, ?, ?)
'> WHERE `', `sanecol`, '` REGEXP ?');
-> PREPARE `stmt` FROM @`t1`;
-> SET @`ftxt` = `ftxt`,
-> @`rtxt` = `rtxt`,
-> @`retxt` = `retxt`;
-> EXECUTE `stmt` USING @`ftxt`, @`rtxt`, @`retxt`;
-> DEALLOCATE PREPARE `stmt`;
-> END LOOP `myLoop`;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> SELECT `id`, `text`
-> FROM `to_replace`;
+----+-------------------------------------------+
| id | text |
+----+-------------------------------------------+
| 1 | LTD$ AAAA |
| 2 | BBBB LIM$ |
| 3 | AAAA LTD$ LIM$ BBBB |
| 4 | FOREVER UNITED LTD |
| 5 | APPLE DEVICES LIMITED |
| 6 | QUICKFIX DESIGNS LIM |
| 7 | FINANCIAL TIMES LTD |
| 8 | BEAUTI SLIM |
| 9 | FINANCIAL TIMES LTD & FOREVER UNITED LTD |
| 10 | FOREVER UNITED LTD & QUICKFIX DESIGNS LIM |
+----+-------------------------------------------+
10 rows in set (0.00 sec)
mysql> CALL `sp_test`('to_replace', 'text');
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT `id`, `text`
-> FROM `to_replace`;
+----+--------------------------------------------------+
| id | text |
+----+--------------------------------------------------+
| 1 | LTD$ AAAA |
| 2 | BBBB LIM$ |
| 3 | AAAA LTD$ LIM$ BBBB |
| 4 | FOREVER UNITED LIMITED |
| 5 | APPLE DEVICES LIMITED |
| 6 | QUICKFIX DESIGNS LIMITED |
| 7 | FINANCIAL TIMES LIMITED |
| 8 | BEAUTI SLIM |
| 9 | FINANCIAL TIMES LIMITED & FOREVER UNITED LIMITED |
| 10 | FOREVER UNITED LTD & QUICKFIX DESIGNS LIMITED |
+----+--------------------------------------------------+
10 rows in set (0.00 sec)
关于mysql - 基于 REGEX 的替换在 MySQL 过程中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43182710/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!