zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    简练网软考知识点整理-项目选择和优先级排列方法
    简练网软考知识点整理-项目基线
    简练网软考知识点整理-项目质量控制七工具之排列图
    简练网软考知识点整理-项目经理应具备的技能能力
    简练网软考知识点整理-项目招投标相关法律
    Scala集合库、模式匹配和样例类
    Scala函数式编程
    Scala面向对象—类详解2(继承相关)
    gVerify验证码
    Scala面向对象—类详解
  • 原文地址:https://www.cnblogs.com/qinxu/p/9262904.html
Copyright © 2011-2022 走看看