Redshift REGEXP_SUBSTR获得最后一次匹配

问题描述 投票:0回答:1

我有一个所有类型的页面事件的列表,这些列表事件的列值是使用listagg方法按时间asc排序的。listagg(page,';') within group (order by time)

我想获取与正则表达式匹配的最后一个匹配项regexp_substr(event_list,'/step[0-9]+[^;]*')

根据docs“,一个正整数,指示要开始搜索的source_string中的位置。该位置基于字符数,而不是字节数,因此多字节字符被视为单个字符。默认值为1。小于1,搜索从source_string的第一个字符开始。如果position大于source_string中的字符数,则结果为source_string。“

基于此,我需要知道我不知道的确切发生次数。在这种情况下如何获得最后一场比赛?例如:/step1;somethging;somethig;/step2;something;/step3;something;

我想匹配步骤3。

PS:按时间顺序排序并获得第一个比赛不是这里的选项。

sql amazon-redshift data-warehouse regexp-substr listagg
1个回答
0
投票

使用regexp_count确定有多少个匹配项(regexp_count),然后使用n获得第regexp_substr个匹配项。

regexp_substr

输出:

n

如果select '/step1;somethging;somethig;/step2;something;/step3;something;' string , '/step[0-9]+[^;]*' pat , regexp_count(string, pat) n , regexp_substr(string, pat, 1, n) last_part 可以被当作分隔符,那么您可以选择采用以下策略

颠倒字符串,用 string pat n last_part /step1;somethging;somethig;/step2;something;/step3;something; /step[0-9]+[^;]* 3 /step3 分割并取第一部分。再次反转,以/为前缀并应用正则表达式以提取步骤:

示例:

/

输出:

/
© www.soinside.com 2019 - 2024. All rights reserved.