全球主机交流论坛

标题: mysql正则替换 [打印本页]

作者: 大腿    时间: 2016-4-26 14:18
标题: mysql正则替换
mysql正则替换怎么做
在 表abc 字段xxx中替换字符[1234]为空
1234是4位数字[]固定,语句应该怎么写

作者: 今晚我是你的    时间: 2016-4-26 14:18
大腿 发表于 2016-4-26 14:53
关键是1234是不固定的,有1234 3434 3423 这样的随机4位数字

如果你那个abc还有别的格式,先用我那个查询语句,然后把查询结果导出txt,在用工具替换在导入回去就可以了。

正则直接在mysql里面替换不了,不过你要是单纯全部替换成[],可以直接用[]覆盖全部abc表。
作者: Chuany    时间: 2016-4-26 14:21
提示: 作者被禁止或删除 内容自动屏蔽
作者: crazyalllife    时间: 2016-4-26 14:31
好多钱  好多钱   

作者: a1328788808    时间: 2016-4-26 14:41
好多钱  好多钱
作者: Zeraba    时间: 2016-4-26 14:50
update abc set xxx = replace(xxx,1234,"");  记得做好备份 不用正则 不是固定的么 用replace 函数就行
作者: 大腿    时间: 2016-4-26 14:53
Zeraba 发表于 2016-4-26 14:50
update abc set xxx = replace(xxx,1234,"");  记得做好备份 不用正则 不是固定的么 用replace 函数就行 ...

关键是1234是不固定的,有1234 3434 3423 这样的随机4位数字
作者: 今晚我是你的    时间: 2016-4-26 15:01
本帖最后由 今晚我是你的 于 2016-4-26 17:05 编辑

楼下写的字符截取方式也可以实现
作者: cgs3238    时间: 2016-4-26 15:06
本帖最后由 cgs3238 于 2016-4-26 15:22 编辑
  1. update biao set xxx=replace(xxx, concat('[',SUBSTRING_INDEX(SUBSTRING_INDEX(xxx, '[', -1), ']', 1),']'), '')
  2. where SUBSTRING_INDEX(SUBSTRING_INDEX(xxx, '[', -1), ']', 1) REGEXP '^[0-9]{4}';
复制代码

作者: art    时间: 2016-4-26 15:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: the2ndface    时间: 2016-4-26 15:42
art 发表于 2016-4-26 15:10

姑娘,我看你抠腚的样子不错,跟我学做菜吧
作者: zsl198854    时间: 2016-4-26 15:44
啧啧啧
作者: 今晚我是你的    时间: 2016-4-26 16:20
本帖最后由 今晚我是你的 于 2016-4-26 17:06 编辑

不错,学习了
作者: Zeraba    时间: 2016-4-26 18:25
大腿 发表于 2016-4-26 14:53
关键是1234是不固定的,有1234 3434 3423 这样的随机4位数字

贴点真实数据来看看 看看需要替换的内容有啥规律 主要是确认规律 后面想办法替换 比如连续不固定数字 数字长度4位  内容长度最长16位 这样也是可以的 多写几句而已
作者: kaleok    时间: 2016-4-26 21:59
本来一个PHP正则简单处理再update就搞定的事情,为什么一定要用mysql语句来搞呢?

作者: kaleok    时间: 2016-4-26 22:01
$value = preg_replace("/[0-9]{4}/", "", $value );
然后 再存回去就搞定了
作者: Jessynt    时间: 2016-4-26 22:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: zyypp    时间: 2016-4-27 00:04
第一种方法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大拿们问问吧




欢迎光临 全球主机交流论坛 (https://loc.193.gs/) Powered by Discuz! X3.4