GreenPlumn(下称GP)中原生不自带instr函数,导致一些场景下的困境,笔者使用GP的自定义函数功能实现instr。代码如下(python实现):
/* 函数名称:f_instr
* 入参:datas 要进行instr操作的字段,字符串类型
* sep 查找的目标字符,字符类型
* strfrom 从datas参数的哪一位开始查起(返回计算结果不包含该位)
* whichpos 匹配多少个sep(若该参数指定的sep个数不够,则返回-1)
* 返回值类型:int
* 返回值示例:5
* 函数功能概述:实现类似Oracle中instr()的功能。
* 本函数接收四个参数,用于定位指定并返回指定字符串中某个字符的位置索引,若
* 未找到,返回-1
*/
CREATE OR REPLACE FUNCTION f_instr(datas text, sep text, strfrom int,whichpos int)
RETURNS int AS
$BODY$
v_deal_datas = datas[strfrom:]
v_target_cnt = 0
if sep in v_deal_datas:
for i in range(0,len(v_deal_datas)):
if str(v_deal_datas[i]) == sep:
v_target_cnt = v_target_cnt + 1
if v_target_cnt == whichpos:
return i+1+strfrom
else:
return -1
return -1
$BODY$
LANGUAGE plpythonu VOLATILE;
ALTER FUNCTION f_instr(text, text, int, int) owner to dw;
效果如下: