在EsgynDB2.5版本以前,虽然已经支持了instr函数,但只支持两个参数的方式,即查询匹配某个字符串出现的位置(默认首次)。如下,
>>select instr('aaa#bbb#ccc','#') from dual;
(EXPR)
----------
4
--- 1 row(s) selected.
此时,instr函数也可以用position函数代替,如,
>>select position('#' in 'aaa#bbb#ccc') from dual;
(EXPR)
----------
4
--- 1 row(s) selected.
无论是instr函数,或是position函数,都只能获取匹配字符在字符串中第一次出现的位置,但如果想获取第二个#或者第三个第四个#出现的位置就不能做到了。
在即将到来的EsgynDB 2.5的版本里面,我们对instr函数做了改进,不仅可以支持原来的两个参数的方式,也支持三个、四个参数的方式。
格式一:instr( string1, string2 ) / instr(源字符串, 目标字符串)
格式二:instr( string1, string2 , start_position ) / instr(源字符串, 目标字符串, 起始位置)
格式三:instr( string1, string2 , start_position , nth_appearance ) / instr(源字符串, 目标字符串, 起始位置, 匹配序号)
格式四:instr( string2 in string1 ) / instr(源字符串, 目标字符串, 起始位置, 匹配序号)
解析:string2 的值要在string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。
下面我们仍然用上述例子来试验四个参数的情况下查询第N个匹配的字符串的位置,
//从第1位开始查询第1个#的位置
>>select instr('aaa#bbb#ccc','#',1,1) from dual;
(EXPR)
----------
4
--- 1 row(s) selected.
//从第1位开始查询第2个#的位置
>>select instr('aaa#bbb#ccc','#',1,2) from dual;
(EXPR)
----------
8
--- 1 row(s) selected.
//从第5位开始查询第1个#的位置
>>select instr('aaa#bbb#ccc','#',5,1) from dual;
(EXPR)
----------
8
--- 1 row(s) selected.
//IN方式,查找第一个匹配,相当于position函数
>>select instr('#' in 'aaa#bbb#ccc') from dual;
(EXPR)
----------
4
--- 1 row(s) selected.
//三个参数,表示查找从第N位开始的第一个匹配位置
>>select instr('aaa#bbb#ccc','#',5) from dual;
(EXPR)
----------
8
--- 1 row(s) selected.