Kingbase实现Oracle instr函数功能

目录

1. 问题

2. 文档概述

3. Oracle instr()函数功能调研

3.1. 函数名称/函数原型

3.2. 函数功能

3.3. 参数介绍

3.3.1. String

3.3.2. Substring

3.3.3. position

3.3.4. occurrence

3.4. 函数示例

3.4.1. 示例1:常规示例

3.4.2. 示例2:使用position参数,指定搜索的起始下标

3.4.3. 示例3:使用occurrence参数,指定匹配次数

3.5. 基于Kingbase适配instr函数功能的实现

3.5.1. 实现instr(string, substring)函数

3.5.2. 实现instr(string, substring, position)函数

3.5.3. 实现instr(string, substring, position, occurrence)函数


1. 问题

Kingbase如何实现Oracle的instr函数功能

2. 文档概述

本文主要是通过调研Oracle的instr函数功能,然后基于kingbase自定义函数形式实现instr函数功能。

3. Oracle instr()函数功能调研

3.1. 函数名称/函数原型

Instr(string, substring);

Instr(string, substring[, position[, occurrence]]);

3.2. 函数功能

Instr函数功能搜索string字符串中是否存在substring子字符串,如果从string字符串中找到了substring子字符串,则返回一个整数,表示该substring子字符串在string字符串中的位置,如果未找到,则该函数返回零。

3.3. 参数介绍

3.3.1. String

string被搜索的字符串。

3.3.2. Substring

substring期望被搜索到的子字符串。

3.3.3. position

position是一个非零整数,表示从string字符串的起始什么位置开始向后搜索。如果position为负,则表示从string字符串的末尾什么位置开始向前搜索。

如果不输入该值,则默认表示从string字符串起始位置开始搜索,即默认值等于1。

3.3.4. occurrence

occurrence是一个正整数,指示substring应该在string中的第几次出现。如果occurrence值大于1,则数据库不会在第一次匹配到substring时返回,而是继续比较,直到出现occurrence次匹配时才返回。

如果不输入该值,则默认表示第一次匹配到substring子字符串时则返回,即默认值等于1。当需要输入occurrence值时, position值不能为空。

3.4. 函数示例

3.4.1. 示例1:常规示例

SQL> Select instr('helloworld', 'l') from dual;



INSTR('HELLOWORLD', 'L')

---------------------------

  3

3.4.2. 示例2:使用position参数,指定搜索的起始下标

SQL> Select instr('helloworld', 'l', 5) from DUAL;



INSTR('HELLOWORLD', 'L', 5)

---------------------------

                9

3.4.3. 示例3:使用occurrence参数,指定匹配次数

SQL> Select instr('helloworld', 'l', 2, 2) from DUAL;



INSTR('HELLOWORLD', 'L', 2, 2)

------------------------------

4

3.5. 基于Kingbase适配instr函数功能的实现

3.5.1. 实现instr(string, substring)函数

CREATE FUNCTION instr(varchar, varchar) RETURNS integer IS

    pos integer;

BEGIN

    pos:= instr($1, $2, 1);

    RETURN pos;

END;

3.5.2. 实现instr(string, substring, position)函数

CREATE FUNCTION instr(string varchar, string_to_search varchar,

beg_index integer)

RETURNS integer IS

    pos integer NOT NULL DEFAULT 0;

    temp_str varchar;

    beg integer;

    length integer;

    ss_length integer;

BEGIN

    IF beg_index > 0 THEN

        temp_str := substring(string FROM beg_index);

        pos := position(string_to_search IN temp_str);



        IF pos = 0 THEN

            RETURN 0;

        ELSE

            RETURN pos + beg_index - 1;

        END IF;

    ELSIF beg_index < 0 THEN

        ss_length := char_length(string_to_search);



        length := char_length(string);

        beg := length + beg_index - ss_length + 2;



        WHILE beg > 0 LOOP

            temp_str := substring(string FROM beg FOR ss_length);

            pos := position(string_to_search IN temp_str);



            IF pos > 0 THEN

                RETURN beg;

            END IF;



            beg := beg - 1;

        END LOOP;



        RETURN 0;

    ELSE

        RETURN 0;

    END IF;

END;

3.5.3. 实现instr(string, substring, position, occurrence)函数

CREATE FUNCTION instr(string varchar, string_to_search varchar,

                      beg_index integer, occur_index integer)

RETURNS integer IS

    pos integer NOT NULL DEFAULT 0;

    occur_number integer NOT NULL DEFAULT 0;

    temp_str varchar;

    beg integer;

    i integer;

    length integer;

    ss_length integer;

BEGIN

    IF beg_index > 0 THEN

        beg := beg_index;

        temp_str := substring(string FROM beg_index);



        FOR i IN 1..occur_index LOOP

            pos := position(string_to_search IN temp_str);



            IF i = 1 THEN

                beg := beg + pos - 1;

            ELSE

                beg := beg + pos;

            END IF;



            temp_str := substring(string FROM beg + 1);

        END LOOP;



        IF pos = 0 THEN

            RETURN 0;

        ELSE

            RETURN beg;

        END IF;

    ELSIF beg_index < 0 THEN

        ss_length := char_length(string_to_search);

        length := char_length(string);

        beg := length + beg_index - ss_length + 2;



        WHILE beg > 0 LOOP

            temp_str := substring(string FROM beg FOR ss_length);

            pos := position(string_to_search IN temp_str);



            IF pos > 0 THEN

                occur_number := occur_number + 1;



                IF occur_number = occur_index THEN

                    RETURN beg;

                END IF;

            END IF;



            beg := beg - 1;

        END LOOP;



        RETURN 0;

    ELSE

        RETURN 0;

    END IF;

END;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值