GBase 8s自定义使用find_in_set()函数
从mysql迁移到GBase 8s数据库时,原有find_in_set函数在GBase 8s中不可用,因此需要自己创建相应的函数,可以使用C或者JAVA创建自定义例程,也可以使用存储过程。以下以存储过程方式创建。
该函数实现的功能是:第一个参数pstr在第二个参数pstrlist,以pdel为分隔符(默认为,)中的分隔位置。
文档更新于2023-12-29
DROP FUNCTION IF EXISTS find_in_set(VARCHAR,VARCHAR,varchar);
CREATE FUNCTION find_in_set(pstr varchar(255),pstrlist varchar(255),pdel varchar(10) DEFAULT ',')
RETURNS int WITH (NOT variant);
define v_curr int; -- 当前位置
define v_last int; -- 下一位置
define v_num int; -- 计数
define v_tmpstr varchar(255); -- 临时文本
ON EXCEPTION
RETURN NULL;
END EXCEPTION;
let v_num = 1;
let v_curr = 1;
loop
let v_last = instr(pstrlist,pdel,1,v_num);
IF v_last > 0 THEN
let v_tmpstr = substr(pstrlist,v_curr,(v_last - v_curr));
ELSE
let v_tmpstr = substr(pstrlist,v_curr);
END IF;
IF pstr = v_tmpstr THEN
RETURN v_num;
END IF;
exit WHEN v_last == 0;
let v_num = v_num + 1;
let v_curr = v_last + 1;
END loop;
RETURN 0;
END FUNCTION;
示例:
select find_in_set('南大','南大通用,天津南大通用,南大,南大通用北京,广东南大通用') from dual;
得到的结果如下:
|(expression) |
|-------------|
|3 |