Я пытаюсь проанализировать приведенный ниже запрос, связанный с иерархической структурой, и Regex может помочь мне понять? - PullRequest
0 голосов
/ 13 октября 2018

Я столкнулся с запросом ниже, но не могу завершить анализ, связанный с запросом ниже.Основная цель запроса ниже - преобразовать число в алфавит.Но использование иерархического запроса привело меня в замешательство.

merge into s_export ex
using (
       select
        listagg(n, '') within group (order by lv) new_val,
        row_id
      from
        (
          SELECT
            connect_by_root rowid row_id,
            LEVEL lv,
            CASE
               WHEN Regexp_like(Regexp_substr( file_as, '[^0-9]+|((\d+)(st|nd|rd|th)?)', 1, LEVEL ), '\d+')
                  THEN spell_number(
                                Regexp_substr( file_as, '[^0-9]+|((\d+)(st|nd|rd|th)?)', 1, LEVEL, NULL, 2),
                                Regexp_substr( file_as, '[^0-9]+|((\d+)(st|nd|rd|th)?)', 1, LEVEL, NULL, 3)
                               )
               ELSE Regexp_substr( file_as, '[^0-9]+|((\d+)(st|nd|rd|th)?)', 1, LEVEL )
            END N
          FROM s_export d
          CONNECT BY NOCYCLE Regexp_substr( file_as, '([^0-9]+)|(\d+)(st|nd|rd|th)?', 1, LEVEL ) IS NOT NULL
                             and rowid = prior rowid
                             and prior dbms_random.value is not null
        )
      group by row_id
                      ) t
on (t.row_id = ex.rowid)
when matched then
 update set ex.file_as = t.new_val;

Пример набора данных:

create table s_export  (file_as varchar2(2000));


insert into s_export  values ('Collection Four') ;
insert into s_export  values ('OM_Forty-One One');
insert into s_export  values ('OM_Twenty-Two | SOFifteen');
insert into s_export  values ('1st');
insert into s_export  values ('3M');
insert into s_export  values ('Collection Six');
insert into s_export  values ('2ND');
insert into s_export  values ('11TH100');

Ниже мое понимание:

  1. Мы выполняем обновление таблицы s_export столбец file_as всякий раз, когда есть какое-либо число, скажем 1, оно преобразует это в 'one'.

  2. .LEVEL используется в Regexp_substr работе как происшествие.

1 Ответ

0 голосов
/ 16 октября 2018

Я проанализировал запрос, упомянутый выше, ниже приведен мой анализ для справки.

Предположим, у нас есть пример данных в нашей таблице s_export , наша цель здесь - преобразовать числовые значениязначение появилось в строке в алфавите .

file_as     ROW_ID
-------     -------
123Test123  101

Мы можем разделить запрос на 3 части, начиная с самой внутренней

Шаг 1: Преобразоватьстрока в алфавит.

   SELECT
        connect_by_root rowid row_id,
        LEVEL lv,
        CASE
           WHEN Regexp_like(Regexp_substr( file_as, '[^0-9]+|((\d+)(st|nd|rd|th)?)', 1, LEVEL ), '\d+')
              THEN spell_number(
                            Regexp_substr( file_as, '[^0-9]+|((\d+)(st|nd|rd|th)?)', 1, LEVEL, NULL, 2),
                            Regexp_substr( file_as, '[^0-9]+|((\d+)(st|nd|rd|th)?)', 1, LEVEL, NULL, 3)
                           )
           ELSE Regexp_substr( file_as, '[^0-9]+|((\d+)(st|nd|rd|th)?)', 1, LEVEL )
        END N
      FROM s_export d
      CONNECT BY NOCYCLE Regexp_substr( file_as, '([^0-9]+)|(\d+)(st|nd|rd|th)?', 1, LEVEL ) IS NOT NULL
                         and rowid = prior rowid
                         and prior dbms_random.value is not null

Если в столбце file_as есть какая-либо строка, скажем, в нашем случае "123Test123", этот запрос будет принимать row_id конкретной строки и получать подстроку изнапример, они считают row_id этой строки как 101, теперь будет 3 строки с одинаковым row_id, единственная разница не будет в уровне (No of split), и каждое число будет конвертировано в алфавит, используя (spell_number)

Исходное значение: 123Test123

ROW_ID  LV      N
------- ------- -------
101     1       One Hundred Twenty-Three
101     2       Test
101     3       One Hundred Twenty-Three

2: Группировка данных, полученных в результате преобразования

 select
    listagg(n, '') within group (order by lv) new_val,
    row_id
  from (
  ---Query from Step 1
  )  group by row_id

Теперь с результатом, полученным из вышеприведенного вывода, мывыполнит "listagg" (например, передвинет столбец в строку) и объединит значения столбца "N", полученные из самого внутреннего запроса, чтобы получить единственное строковое значение на основе группировки их по row_id,

NEW_VAL                                                     ROW_ID
-------                                                     -------
One Hundred Twenty-Three Test One Hundred Twenty-Three      101

Шаг 3: Объединить данные в столбец исходной таблицы

merge into s_export ex
using (
        --Query from Step 2 (Including Step 1)
        )  t
on (t.row_id = ex.rowid)
when matched then
 update set ex.file_as = t.new_val;

Теперь мы объединяем полученный в результате запроса "NEW_VAL" столбец "file_as" в s_export на основедля row_id.

Окончательный преобразованный результат:

file_as                                                     ROW_ID
-------                                                     -------
One Hundred Twenty-Three Test One Hundred Twenty-Three      101
...