目录
3.4.2. 示例2:使用position参数,指定搜索的起始下标
3.4.3. 示例3:使用occurrence参数,指定匹配次数
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;