Как SQLite преобразовать строку «123 [45] / 67 [8] / 9 [10]» в «123/67/9» - PullRequest
2 голосов
/ 14 февраля 2020

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

что я пробовал

Я пытался использовать трим или заменить, но это не сработало.

1 Ответ

4 голосов
/ 14 февраля 2020

Единственный способ сделать это - использовать рекурсивный 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;

Здесь - это скрипта db <>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...