我有一张这样的table
Jack|Sparrow|17-09-16|DY7009|Address at some where|details
Jack|Sparrow|17-09-16|DY7009|
我想提取第五次或第n次出现的(使用|以确定它)。如果该行的出现次数少于5次,我想返回该行的最大出现次数。
下面是我的脚本:
with a as (
select 'Jack|Sparrow|17-09-16|DY7009|Address at some where|details ' from dual test
union all select 'Jack|Sparrow|17-09-16|DY7009|' from dual test
)
select substr(test,1,(REGEXP_instr(test,'[^|]+',1,5))) from a;
以下是我的结果:
Jack|Sparrow|17-09-16|DY7009|A
null
我的预期结果:
Jack|Sparrow|17-09-16|DY7009|Address at some where|
Jack|Sparrow|17-09-16|DY7009|
有什么办法可以让我这么做吗?多谢了。
3条答案
按热度按时间d6kp6zgx1#
您可以将整个列内容(包括最后的管道)作为一个组进行匹配,并使用匹配量词
{m,n}
捕获不超过5个组。然后使用regexp_substr
提取匹配:fiddle
9q78igpj2#
尝试使用这样的查询,它应该可以解决您的问题:
你可以使用查询here。
igetnqfo3#
或者,在没有正则表达式的情况下,使用标准的
substr + instr
组合(在大型数据集上可能性能更好)。样本数据(从astentx借用;谢谢!):
查询: