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吧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)