Используйте регулярное выражение с обратной ссылкой, чтобы соответствовать повторяющимся терминам:
Установка Oracle :
CREATE TABLE test_data ( value ) AS
SELECT '9999999(12345) 9999999(12345) 9999999(12345) 9999999(12345)' FROM DUAL;
Запрос
SELECT REGEXP_REPLACE( value, '([^ ]+)( \1)+', '\1' ) AS replaced_value
FROM test_data
выход
| REPLACED_VALUE |
| :------------- |
| 9999999(12345) |
дБ <> скрипка здесь
Обновлено : Для новых данных в 6-м редактировании:
CREATE TABLE test_data ( value ) AS
SELECT '9999999(12345) 9999999(12345) 9999999(12345) 9999999(12345)' FROM DUAL UNION ALL
SELECT '113307425(2) 310122174(2) 310122174(2) 113307425(2)' FROM DUAL;
Запрос
Используйте рекурсивное условие факторинга подзапроса, чтобы найти термины в строке, а затем используйте DISTINCT
, чтобы удалить дубликаты, и LISTAGG
, чтобы объединить их обратно в одну строку.
WITH bounds ( id, value, start_pos, end_pos ) AS (
SELECT ROWID,
value,
1,
INSTR( value, ' ', 1 )
FROM test_data
UNION ALL
SELECT id,
value,
end_pos + 1,
INSTR( value, ' ', end_pos + 1 )
FROM bounds
WHERE end_pos > 0
),
strings ( id, value ) AS (
SELECT DISTINCT
id,
CASE end_pos
WHEN 0
THEN SUBSTR( value, start_pos )
ELSE SUBSTR( value, start_pos, end_pos - start_pos )
END
FROM bounds
)
SELECT LISTAGG( value, ' ' ) WITHIN GROUP ( ORDER BY value ) AS unique_values
FROM strings
GROUP BY id
выход
| UNIQUE_VALUES |
| :------------------------ |
| 9999999(12345) |
| 113307425(2) 310122174(2) |
дБ <> скрипка здесь