mysql正则替换某个字段

mysql正则替换某个字段,第1张

代码如下:

CREATE PROCEDURE sp_str

(

IN p_str VARCHAR(50), /*原始字符串*/

IN p_begin_str VARCHAR(50), /*要匹配的起始字符串*/

IN p_end_str VARCHAR(50)) /*要匹配的结束字符串*/

OUT p_result VARCHAR(50)) /*返回结果*/

NOT DETERMINISTIC

SQL SECURITY DEFINER

COMMENT ''

BEGIN

DECLARE m_len INT DEFAULT 0

DECLARE m_index INT DEFAULT 0

/*计算第一个匹配字符串的索引位置*/

select locate(p_begin_str,p_str)+char_length(p_begin_str) into m_index

/*计算第一个匹配字符串的长度*/

select locate(p_end_str,p_str,m_index) into m_len

select SUBSTRING(p_str,m_index,m_len-m_index) INTO p_result

END

执行:

CALL sp_str('[]abcd[12345]aa[]ss','abcd[',']',@result)

返回值 @result 为12345

call sp_str('[]abcd[sdww]aa[]ss','abcd[',']',@result)

返回值 @result 为sdww

如果不用存储过程,可以直接写sql语句实现:

代码如下:

select SUBSTRING(

']abcd[12345]111[]',

locate('abcd[',']abcd[12345]111[]')+CHAR_LENGTH('abcd['),

locate(']',']abcd[12345]111[]',CHAR_LENGTH('abcd['))-

(select locate('abcd[',']abcd[12345]111[]')+CHAR_LENGTH('abcd['))

)

返回值为 12345

关于mysql的函数介绍:

CHAR_LENGTH(str)

返回字符串str的长度。

LOCATE(substr,str)

POSITION(substr IN str)

返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0.

mysql>select LOCATE('bar', 'foobarbar')

->4

mysql>select LOCATE('xbar', 'foobar')

->0

该函数是多字节可靠的。 LOCATE(substr,str,pos)

返回子串substr在字符串str第一个出现的位置,从位置pos开始。如果substr不是在str里面,返回0。

mysql>select LOCATE('bar', 'foobarbar',5)

->7

这函数是多字节可靠的。

SUBSTRING(str,pos,len)

SUBSTRING(str FROM pos FOR len)

MID(str,pos,len)

从字符串str返回一个len个字符的子串,从位置pos开始。使用FROM的变种形式是ANSI SQL92语法。

mysql>select SUBSTRING('Quadratically',5,6)

->'ratica'

该函数是多字节可靠的。

SUBSTRING(str,pos)

mysql的正则匹配用regexp,而替换字符串用REPLACE(str,from_str,to_str)例如UPDATE myTable SET HTML=REPLACE(HTML,'','') WHERE HTML REGEXP '( */*\s*){2,}'

可是这么写会把所有全部替换掉,因此干脆把REPLACE(HTML,'','')改成REPLACE(HTML,substr(HTML,locate('',HTML)+strlen(''),strlen('')),'')

这还不够,还得手动写多个''、'///',

还不够,还得循环数次这些命令。。。。

关键的是,SQL语句无法实现正则匹配后取其中一部分的字符串来替换,所以你这里用sql实现是异常蛋疼的,干脆在程序里做正则替换,然后update吧。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/8498893.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-17
下一篇 2023-04-17

发表评论

登录后才能评论

评论列表(0条)

保存