mysql 替代Oracle instr


在遷移項目時遇到的,原項目的數據庫使用的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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM