ccee图片

MySQL 一直以来都支持正则匹配,不过对于正则替换则一直到MySQL 8.0 才支持。对于这类场景,以前要么在MySQL端处理,要么把数据拿出来在应用端处理。

比如我想把表y1的列str1的出现第3个action的子 串替换成dble,怎么实现?


1. 自己写SQL层的存储函数。代码如下写死了3个,没有优化,仅仅作为演示,MySQL 里非常不建议写这样的函数。

  • mysql

  • DELIMITER $$

  • USE `ytt`$$

  • DROP FUNCTION IF EXISTS `func_instr_simple_ytt`$$

  • CREATE DEFINER=`root`@`localhost` FUNCTION `func_instr_simple_ytt`(

  • f_str VARCHAR(1000), -- Parameter 1

  • f_substr VARCHAR(100),  -- Parameter 2

  • f_replace_str varchar(100),

  • f_times int -- times counter.only support  3.

  • ) RETURNS varchar(1000)

  • BEGIN

  • declare v_result varchar(1000) default ytt; -- result.

  • declare v_substr_len int default 0; -- search string length.

  • set f_times = 3; -- only support  3.

  • set v_substr_len = length(f_substr);

  • select instr(f_str,f_substr) into @p1; -- First real position .

  • select instr(substr(f_str,@p1+v_substr_len),f_substr) into @p2; Secondary virtual position.

  • select instr(substr(f_str,@p2+ @p1 +2*v_substr_len - 1),f_substr) into @p3; -- Third virtual position.

  • if @p1 > 0  && @p2 > 0 && @p3 > 0 then -- Fine.

  • select

  • concat(substr(f_str,1,@p1 + @p2 + @p3 + (f_times - 1) * v_substr_len  - f_times)

  • ,f_replace_str,

  • substr(f_str,@p1 + @p2 + @p3 + f_times * v_substr_len-2)) into v_result;

  • else

  • set v_result = f_str; -- Never changed.

  • end if;

  • -- Purge all session variables.

  • set @p1 = null;

  • set @p2 = null;

  • set @p3 = null;

  • return v_result;

  • end;

  • $$

  • DELIMITER ;

  • -- 调用函数来更新:

  • mysql> update y1 set str1 = func_instr_simple_ytt(str1,action,dble,3);

  • Query OK, 20 rows affected (0.12 sec)

  • Rows matched: 20  Changed: 20  Warnings: 0

  • 2. 导出来用sed之类的工具替换掉在导入,步骤如下:(推荐使用)

    1)导出表y1的记录。

  • mysqlmysql> select * from y1 into outfile /var/lib/mysql-files/y1.csv;Query OK, 20 rows affected (0.00 sec)


  • 2)用sed替换导出来的数据。

  • shellroot@ytt-Aspire-V5-471G:/var/lib/mysql-files#  sed -i s/action/dble/3 y1.csv


  • 3)再次导入处理好的数据,完成。

  • mysql

  • mysql> truncate y1;

  • Query OK, 0 rows affected (0.99 sec)

  • mysql> load data infile /var/lib/mysql-files/y1.csv into table y1;

  • Query OK, 20 rows affected (0.14 sec)

  • Records: 20  Deleted: 0  Skipped: 0  Warnings: 0

  • 以上两种还是推荐导出来处理好了再重新导入,性能来的高些,而且还不用自己费劲写函数代码。

    那MySQL 8.0 对于以上的场景实现就非常简单了,一个函数就搞定了。

  • mysqlmysql> update y1 set str1 = regexp_replace(str1,action,dble,1,3) ;Query OK, 20 rows affected (0.13 sec)Rows matched: 20  Changed: 20  Warnings: 0


  • 还有一个regexp_instr 也非常有用,特别是这种特指出现第几次的场景。比如定义 SESSION 变量@a。

  • mysqlmysql> set @a = aa bb cc ee fi lucy  1 1 1 b s 2 3 4 5 2 3 5 561 19 10 10 20 30 10 40;Query OK, 0 rows affected (0.04 sec)


  • 拿到至少两次的数字出现的第二次子串的位置。

  • mysqlmysql> select regexp_instr(@a,[:digit:]{2,},1,2);+--------------------------------------+| regexp_instr(@a,[:digit:]{2,},1,2) |+--------------------------------------+|                                   50 |+--------------------------------------+1 row in set (0.00 sec)


  • 那我们在看看对多字节字符支持如何。

  • mysql

  • mysql> set @a = 中国 美国 俄罗斯 日本 中国 北京 上海 深圳 广州 北京 上海 武汉 东莞 北京 青岛 北京;

  • Query OK, 0 rows affected (0.00 sec)

  • mysql> select regexp_instr(@a,北京,1,1);

  • +-------------------------------+

  • | regexp_instr(@a,北京,1,1)   |

  • +-------------------------------+

  • |                            17 |

  • +-------------------------------+

  • 1 row in set (0.00 sec)

  • mysql> select regexp_instr(@a,北京,1,2);

  • +-------------------------------+

  • | regexp_instr(@a,北京,1,2)   |

  • +-------------------------------+

  • |                            29 |

  • +-------------------------------+

  • 1 row in set (0.00 sec)

  • mysql> select regexp_instr(@a,北京,1,3);

  • +-------------------------------+

  • | regexp_instr(@a,北京,1,3)   |

  • +-------------------------------+

  • |                            41 |

  • +-------------------------------+

  • 1 row in set (0.00 sec)

  • 那总结下,这里我提到了 MySQL 8.0 的两个最有用的正则匹配函数 regexp_replace 和 regexp_instr。针对以前类似的场景算是有一个完美的解决方案。

这个问题研究好久了。题主如果有答案请务必补充一下。我是想把xxx123.jpg,xxx456.jpg......变成xxx.jpg
题主我昨天测试了一下。你可以用width="\w\w\w"和width="\w\w\w\w"来匹配原来的数据。然后替换成为width="100%"就可以了。\w指的是任意字符包括下划线,但只能匹配到一个字符。所以要根据字符的数量来添加减少。如果是字母,还是没有办法做因变量进行分析你必须先全部将其替换,把abcd依次替换成数字1234来代替,之后再把变量类型 由字符型改成数值型就可以了; 如果你直接是字母改的话 改完以后所有的值都会成缺失不见了 之后就可以采用logistic回归进行分析了mysql 正则表达式替换,把指定位置随机数替换成固定数字
”将里面的数字替换成大写的数字?“数字只有小写,比如,0,1,2没听说过有大写的。只听说过,有这些:I,II,III一,二,三壹,贰,叁。mysql 正则表达式替换,把指定位置随机数替换成固定数字
”将里面的数字替换成大写的数字?“数字只有小写,比如,0,1,2没听说过有大写的。只听说过,有这些:I,II,III一,二,三壹,贰,叁。
喜欢阅读
  • 宠婚入骨:娇妻来袭

    宠婚入骨:娇妻来袭

    一场阴谋,迫使形婚的两人意外的假戏真做。沈薇薇从此堕入顾家大少的魔掌,纵使婆婆不爱,小姑子不待见,沈薇薇依然坚强挺过,却终因误会做了甩手掌柜,带娃离开。两年后再度重逢,他却像中了蛊一样对她欲罢不能。“顾琛,能不能放开我,我们早就已经两不相欠!”顾大总裁却邪魅一笑,在她耳边轻声说道:“不能,因为……我的心你还没还呢!”

  • 冷情王:独宠下堂妃

    冷情王:独宠下堂妃

    乾木木把算盘打的劈啪作响,随即悠然走到男人面前“王爷,我做了你一百多天的王妃,好歹给点酬劳吧?一百万两应该不多吧?陪吃陪睡陪玩,每天才收一万两……”男人咬牙切齿的扔出一叠银票和一张休书,冷冷地从牙缝挤出一个字“滚!”她嫣然一笑捡起地上的休书和银票,转身与他擦肩而过时却是泪眼婆娑。再见时,她站在常胜将军身侧,朝堂之上以女将军之名接受着皇上的嘉奖,完全无视男人捉摸不透的眼神,战争爆发,她随军出征,被北国皇帝俘虏制造假死之后,他站在她的面前,全身血污,对她伸手“我的王妃,我来接你回家。”看着男人深爱的眼神,她凄然一笑,含泪的眼眸看着北国的帝皇,拥进他的怀中,“我的王,我认识他吗?”

  • 龙武军神

    龙武军神

    五年前,他家破人亡,被迫逃亡外乡;五年后,他低调归来,家乡鲜有人知他正是威名远播的帝国军神,那些仇敌也开始蠢蠢欲动,欲要斩草除根……

  • 终结者2之吃鸡王者

    终结者2之吃鸡王者

    退役的WCG世界亚军队长苏南,重回世界之巅!“吃鸡,我是职业的……”

  • 我的淘气王妃

    我的淘气王妃

    所有人都不相信,原来笨蛋也会有春天,当一个叫王妃的普通大一新生,遇见了混世魔王夏何并且一见钟情,她的人生仿佛变得不再平庸。夏何,一个IQ不知道有多少个零冷酷又无情的完美少年,他的人生轨迹从懂事开始就在预料之中度过,宛若魔法师一样,把所有的人看个通透。有一天,一个女孩儿出现在他的面前,先是晴天霹雳,然后人生轨迹的桥梁瞬间崩塌,安静变得不再安静。“我喜欢你!”王妃红着脸蛋对夏何说。冷笑一声,夏何回答,“像你这种长得丑还不知道贴墙走的笨蛋我才不喜欢。”

  • 冷血

    冷血

    当黑暗吞噬光明时,光明也在渐渐的复生,正义的利刃永远掌握在正义使者手中!

  • 龙武神兵

    龙武神兵

    三年前一场绝密任务,让叶兴龙差点命丧黄泉,幸好被鬼医门掌门卫正道所救,三年后,当叶兴龙再次下山,整个世界却早已发生了未知的变化,原来,自己之前所看到的那个世界,只是表象!而现实中,修真者并非一个传说!

  • 10018

    10018

    世代隐居山林的武术世家子弟万林携带兽王小花豹机缘巧合地参加了军队特战部队,并以他们为核心组建了“花豹突击队”。主人公一人一兽绝世的武功和奇异的兽能,统领山间猛兽解救战友于危难,与一切邪恶势力展开了一系列殊死搏斗。

  • 猜你喜欢
    热门推荐
  • lol突围赛
  • xuexishigelangsong
  • x acost y bsint
  • 车内暖风
  • 网件r7800与r7000
  • 穿越红楼邢家
  • 国金汽车
  • aj13什么气垫
  • swagger jsonrpc
  • 秋元真由罗
  • gobi4000 苹果系统
  • 明宫养生酒
  • 第一家西式快餐
  • 跳水的英文
  • stoneisland衣服贵吗
  • 通渭悦心大酒店
  • 小永远男生翻唱
  • 北京天气预报30
  • 感觉脖子被勒住
  • 脑性瘫痪后遗症
  • All Right Reserved 安福网