Я проанализировал запрос, упомянутый выше, ниже приведен мой анализ для справки.
Предположим, у нас есть пример данных в нашей таблице 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