代码之家  ›  专栏  ›  技术社区  ›  Wei Lin

如何将字符串“123[45]/67[8]/9[10]”转换为“123/67/9”

  •  0
  • Wei Lin  · 技术社区  · 5 年前

    DDL和DML

    create table T (value Text);
    insert into T (value) values ('123[45]/67[8]/9[10]'),('333[11]/77[222]/55[3]');
    

    value
    123/67/9
    333/77/55
    

    SQLite 3.8 | db<>fiddle

    我试过的

    我试着用修剪或更换,但没用。

    0 回复  |  直到 5 年前
        1
  •  4
  •   Gordon Linoff    5 年前

    我能想到的唯一方法是使用递归CTE:

    with cte as (
          select NULL as chr, value as rest, 0 as in_braces, '' as output, value, 0 as lev
          from t
          union all
          select substr(rest, 1, 1),
                 substr(rest, 2),
                 (case when rest like '[%' then 1
                       when rest like ']%' then 0
                       else in_braces
                 end) as in_braces,
                 (case when in_braces or rest like '[%' then output
                       else output || substr(rest, 1, 1)
                  end),
                 value, lev + 1
          from cte
          where rest <> ''
         )
    select cte.value, cte.output
    from cte join
         (select value, max(lev) as max_lev
          from cte
          group by value
         ) m
         on cte.value = m.value and cte.lev = m.max_lev;
    

    Here