在迁移项目时遇到的,原项目的数据库使用的Oracle,现在要迁移到MySQL中,而项目中用到了Oracle的instr函数,而MySQL只能查找子串是否在父串中,没法按照出现的次数进行查找。
先来介绍下instr()函数:
1:instr( string1, string2 ) / instr(源字符串, 目标字符串)
2:instr( string1, string2 [, start_position [, nth_appearance ] ] ) / instr(源字符串, 目标字符串, 起始位置, 匹配序号)
string2 的值要在string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。
在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置。只检索一次,也就是说从字符的开始到字符的结尾就结束。
MySQL中要实现Oracle中instr函数功能 :
DELIMITER $$ USE `数据库名称`$$ DROP FUNCTION IF EXISTS `func_instr_oracle`$$ CREATE DEFINER=`用户名`@`IP地址` FUNCTION `func_instr_oracle`( f_str VARCHAR(1000), f_substr VARCHAR(100), f_str_pos INT, f_count INT UNSIGNED ) RETURNS INT(10) UNSIGNED BEGIN DECLARE i INT DEFAULT 0; DECLARE j INT DEFAULT 0; DECLARE v_substr_len INT UNSIGNED DEFAULT 0; DECLARE v_str_len INT UNSIGNED DEFAULT 0; SET v_str_len = LENGTH(f_str); SET v_substr_len = LENGTH(f_substr); -- Unsigned. IF f_str_pos > 0 THEN SET i = f_str_pos; SET j = 0; WHILE i <= v_str_len DO IF INSTR(LEFT(SUBSTR(f_str,i),v_substr_len),f_substr) > 0 THEN SET j = j + 1; IF j = f_count THEN RETURN i; END IF; END IF; SET i = i + 1; END WHILE; -- Signed. ELSEIF f_str_pos <0 THEN SET i = v_str_len + f_str_pos+1; SET j = 0; WHILE i <= v_str_len AND i > 0 DO IF INSTR(RIGHT(SUBSTR(f_str,1,i),v_substr_len),f_substr) > 0 THEN SET j = j + 1; IF j = f_count THEN RETURN i - v_substr_len + 1; END IF; END IF; SET i = i - 1; END WHILE; ELSE RETURN 0; END IF; RETURN 0; END$$ DELIMITER ;
select func_instr_oracle('hello world','w',1,1) as pos;