Установка Oracle :
CREATE TABLE test_data ( value ) AS
SELECT '1234' FROM DUAL UNION ALL
SELECT '1212' FROM DUAL UNION ALL
SELECT '123456789101112' FROM DUAL UNION ALL
SELECT '1 23456789101112' FROM DUAL UNION ALL
SELECT '12AA34' FROM DUAL
Запрос 1 :
Наиболее эффективным решением будут вложенные REPLACE
операторы и, если у вас нет большого количества заменяющих терминов, его будет проще всего просмотреть (если вы аккуратно отформатируете код):
SELECT value,
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
value, '12', 'DEC'
),
'11', 'NOV'
),
'10', 'OCT'
),
'9', 'SEP'
),
'8', 'AUG'
),
'7', 'JUL'
),
'6', 'JUN'
),
'5', 'MAY'
),
'4', 'APR'
),
'3', 'MAR'
),
'2', 'FEB'
),
'1', 'JAN'
) AS replaced_value
FROM test_data;
Вывод :
VALUE | REPLACED_VALUE
:--------------- | :------------------------------------
1234 | DECMARAPR
1212 | DECDEC
123456789101112 | DECMARAPRMAYJUNJULAUGSEPOCTNOVDEC
1 23456789101112 | JAN FEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC
12AA34 | DECAAMARAPR
Запрос 2 :
Если вы хотите перебрать значения, вы можете построить рекурсивный запрос (и даже обработать нечисловые замены):
WITH replacements ( item, replacement ) AS (
SELECT '1', 'JAN' FROM DUAL UNION ALL
SELECT '2', 'FEB' FROM DUAL UNION ALL
SELECT '3', 'MAR' FROM DUAL UNION ALL
SELECT '4', 'APR' FROM DUAL UNION ALL
SELECT '5', 'MAY' FROM DUAL UNION ALL
SELECT '6', 'JUN' FROM DUAL UNION ALL
SELECT '7', 'JUL' FROM DUAL UNION ALL
SELECT '8', 'AUG' FROM DUAL UNION ALL
SELECT '9', 'SEP' FROM DUAL UNION ALL
SELECT '10', 'OCT' FROM DUAL UNION ALL
SELECT '11', 'NOV' FROM DUAL UNION ALL
SELECT '12', 'DEC' FROM DUAL UNION ALL
SELECT 'AA', '???' FROM DUAL
),
list ( item, replacement, next_item, max_item ) AS (
SELECT item,
replacement,
LAG( item ) OVER ( ORDER BY LENGTH( item ) ASC, item ASC ),
MAX( item ) KEEP ( DENSE_RANK LAST ORDER BY LENGTH( item ), item ASC ) OVER ()
FROM replacements
),
replaced_values ( value, item ) AS (
SELECT REPLACE( value, item, replacement ), next_item
FROM test_data
CROSS JOIN
list
WHERE item = max_item
UNION ALL
SELECT REPLACE( value, r.item, replacement ), next_item
FROM replaced_values r
INNER JOIN list l
ON ( r.item = l.item )
WHERE r.item IS NOT NULL
)
SELECT value
FROM replaced_values
WHERE item IS NULL;
Выход :
| VALUE |
| :------------------------------------ |
| DECMARAPR |
| DECDEC |
| DECMARAPRMAYJUNJULAUGSEPOCTNOVDEC |
| JAN FEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC |
| DEC???MARAPR |
db <> скрипка здесь