我有一张约有50万行的表格; varchar(255)UTF8列filename包含一个文件名;
我正在尝试从文件名中去除各种奇怪的字符-以为我会使用字符类: [^a-zA-Z0-9()_ .\\-]
现在, MySQL中是否有一个函数可以让您通过正则表达式进行替换 ? 我正在寻找与REPLACE()函数类似的功能-简化示例如下:
SELECT REPLACE('stackowerflow', 'ower', 'over');
Output: "stackoverflow"
/* does something like this exist? */
SELECT X_REG_REPLACE('Stackoverflow','/[A-Zf]/','-');
Output: "-tackover-low"
我知道REGEXP / RLIKE ,但这些只有在有一个匹配检查,没有与之匹配的是什么 。
(我可以从PHP脚本中执行“ SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\\-]' ”,执行preg_replace ,然后“ UPDATE foo ... WHERE pkey_id=... “,但这看起来像是最后手段缓慢而丑陋的骇客)
#1楼
您可以“做到”……但这并不是很明智的选择……这就像我将要尝试的那样大胆……只要RegReg完全支持您使用perl之类的东西就更好了。
UPDATE db.tbl
SET column =
CASE
WHEN column REGEXP '[[:<:]]WORD_TO_REPLACE[[:>:]]'
THEN REPLACE(column,'WORD_TO_REPLACE','REPLACEMENT')
END
WHERE column REGEXP '[[:<:]]WORD_TO_REPLACE[[:>:]]'
#2楼
我很高兴地报告,由于提出了这个问题,现在有了一个令人满意的答案! 看一下这个很棒的软件包:
https://github.com/mysqludf/lib_mysqludf_preg
示例SQL:
SELECT PREG_REPLACE('/(.*?)(fox)/' , 'dog' , 'the quick brown fox' ) AS demo;
#3楼
请改用MariaDB。 具有功能
REGEXP_REPLACE(col, regexp, replace)
请注意,您也可以使用regexp分组(我发现这非常有用):
SELECT REGEXP_REPLACE("stackoverflow", "(stack)(over)(flow)", '\\2 - \\1 - \\3')
退货
over - stack - flow
#4楼
我们可以在SELECT查询中使用IF条件,如下所示:
假设对于任何带有“ ABC”,“ ABC1”,“ ABC2”,“ ABC3”,...的东西,我们要替换为“ ABC”,然后在SELECT查询中使用REGEXP和IF()条件,就可以实现。
句法:
SELECT IF(column_name REGEXP 'ABC[0-9]$','ABC',column_name)
FROM table1
WHERE column_name LIKE 'ABC%';
例:
SELECT IF('ABC1' REGEXP 'ABC[0-9]$','ABC','ABC1');
#5楼
我们无需使用正则表达式即可解决此问题,此查询仅替换完全匹配的字符串。
update employee set
employee_firstname =
trim(REPLACE(concat(" ",employee_firstname," "),' jay ',' abc '))
例:
emp_id employee_firstname
1个杰伊
2杰伊·阿杰
3周杰伦
执行查询结果后:
emp_id employee_firstname
1 abc
2 abc阿杰
3 abc
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3159894