regex 移除SQL for Redshift中分隔列表中的非数字项

nuypyhwy  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(102)

我正在使用一个名为"代码"的字段,它是一个由逗号分隔的值列表。在每个项目中,都有一个以冒号结尾的标题,冒号后面是代码编号。我只需要每个冒号后面的代码编号列表。
示例值:名称-形式-NA-阶段0:3278648990379886572,规则-NA-不需要的-sdfle2:6886328308933282817,美国-德斯格-订单-阶段1:1273671130817907765
预期输出:3278648990379886572,6886328308933282817,1273671130817907765
标题确实总是以字母开头,以冒号结尾,所以我可以看到REGEXP_REPLACE如何工作,以替换以字母开头和以冒号结尾之间的任何字符串,""可能会工作,但我不擅长REGEXP_REPLACE模式。
侧记,如果有人知道一个很好的指南,了解模式符号的正则表达式将非常感谢!
我试过了,但它不起作用REGEXP_REPLACE(REPLACE(REPLACE(代码,':',''),',',''),'[^0 - 9]+','')

uz75evzq

uz75evzq1#

此解决方案假定了以下几点:

  • 除数字前一行外,其他任何地方都不能使用冒号
  • 一开始就没有号码

在高级别上,此查询查找有多少个冒号,将整个字符串拆分为这么多个部分,然后只保留数字后面逗号以内的数字,然后将这些数字聚合到逗号分隔的列表中。
假设一张表如下:

create temp table tbl_string (id int, strval varchar(1000));
insert into tbl_string
values
(1, 'name-form-na-stage0:3278648990379886572,rules-na-unwanted-sdfle2:6886328308933282817,us-disdg-order-stage1:1273671130817907765');


with recursive cte_num_of_delims AS (
    select max(regexp_count(strval, ':')) AS num_of_delims
    from tbl_string
), cte_nums(nums) AS (
    select 1 as nums
    union all
    select nums + 1
    from cte_nums
    where nums <= (select num_of_delims from cte_num_of_delims)
), cte_strings_nums_combined as (
    select id,
           strval,
           nums as index
    from cte_nums
    cross join tbl_string
), prefinal as (
    select *,
           split_part(strval, ':', index) as parsed_vals
    from cte_strings_nums_combined
    where parsed_vals != ''
    and index != 1
), final as (
    select *,
           case
               when charindex(',', parsed_vals) = 0
                   then parsed_vals
               else left(parsed_vals, charindex(',', parsed_vals) - 1)
               end as final_vals
    from prefinal
)
select listagg(final_vals, ',')
from final

相关问题