第一种方法SQL,也是网上传播比较广的方法,不过缺点是每条记录中不能存在多个要查询替换的值
UPDATE abc
SET xxx = REPLACE (
xxx,
substring(
xxx,
locate('[', xxx),
locate(']', xxx) - locate('[' + 10, xxx)
),
'[]'
);
------------------------------------------------
第二种方法SQL,需要使用到存储过程了,可是存储过程我不太熟悉,所以只能把sql写成两部分了(其中“||” 是操作过程中暂时把[xxxx]替换为的暂定字符,你可以根据情况修改成数据中不会出现的信息)
DROP PROCEDURE IF EXISTS test;
CREATE PROCEDURE test () BEGIN DECLARE a INT;
DECLARE b VARCHAR (30);
DECLARE x INT;
DECLARE s INT DEFAULT 0;
DECLARE cursor_name CURSOR FOR SELECT id, xxx FROM abc;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = 1;
OPEN cursor_name;
FETCH cursor_name INTO a, b;
WHILE s <> 1 DO UPDATE abc SET xxx = REPLACE ( xxx, substring( xxx, locate('[', xxx), locate(']', xxx) - locate('[', xxx) + 1 ), '||' );
FETCH cursor_name INTO a, b;
END WHILE;
CLOSE cursor_name;
END;
CALL test ();
UPDATE abc SET xxx=REPLACE(xxx,'||','[]');
------------------------------------------------
第三种方法php
(代码中的sql操作是随手找了个以前保存的类
http://www.oschina.net/code/snippet_182375_6195)
$list = $db->select('abc');
for ($x=0;$x<count($list);++$x) {
if (preg_match_all('/\[(\d){4}\]/i',$list[$x]['xxx'])) {
$str = preg_replace('/\[(\d){4}\]/i', '[]', $list[$x]['xxx']);
$db->update('abc',array("xxx"=>$str),array('id'=>$list[$x]['id']));
}
}
------------------------------------------------------
1、方法一和方法二中的locate只能匹配字符串中第一次出现的值
2、mysql本身不怎么支持正则模糊修改的,所以我暂时没想到什么好的只匹配的 [4位数字] 的方法
所以方法一和方法二中的替换修改实际是在将 [ 和 ] 中间的所有字符全部替换不管是不是数字也不管多少位都进行替换,所以操作起来也是有弊端的
如果可以最好还是使用脚本语言来做,或者找找牛逼的DBA大拿们问问吧 |