Member 13777735 Ответов: 1

Как удалить несколько вхождений из входной строки с помощью oracle pl/SQL


Удаление повторяющихся слов из адреса с помощью oracle pl/sql:

Есть два типа адресов, которые там будут, ниже приведен пример

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

2.'Старые Мельники коттедж ферма, улица Лесная приложении зале ожидается выход Старого мельника' это - 'коттедж ферма, улица Лесная приложении зале старого'. Здесь коттедж присутствует, так что дубликат можно удалить либо с левой стороны, либо с правой стороны, любой из них правильный.

Мне было поручено сделать это через анонимный блок PL/SQL или через функцию. Любая помощь будет оценена по достоинству.

Что я уже пробовал:

СОЗДАЙТЕ ИЛИ ЗАМЕНИТЕ ФУНКЦИЮ FN_ADD_CLEANUP(ADD_IN В VARCHAR2)
RETURN VARCHAR2 IS
КОЛИЧЕСТВО NO_SPACES ;
F_ADD VARCHAR2(255);
T_ADD VARCHAR2(255);
ADD_OUT VARCHAR2(255);

НАЧАТЬ

-- ИНИЦИАЛИЗАЦИЯ ЗНАЧЕНИЯ ПАРАМЕТРА
ВЫБЕРИТЕ LTRIM(RTRIM(ADD_IN)) В F_ADD С ДВОЙНОЙ;

-- УСТАНОВИТЬ НЕТ ПРОБЕЛОВ
ВЫБЕРИТЕ REGEXP_COUNT(F_ADD, ' ') В NO_SPACES ИЗ DUAL;

-- ОБРЕЗНАЯ СТРУНА
ВЫБЕРИТЕ TRIM(SUBSTR(F_ADD, INSTR(F_ADD, ' ', 1, NO_SPACES/2 + 1))) В T_ADD С ДВОЙНОЙ;

-- РЕЗУЛЬТАТ
ADD_OUT := СЛУЧАЙ, КОГДА F_ADD ПОХОЖ НА T_ADD||'%'
ЗАТЕМ SUBSTR(F_ADD, 1, LENGTH(F_ADD) - LENGTH(T_ADD))
ЕЩЕ F_ADD
КОНЕЦ;

ВЕРНУТЬСЯ ADD_OUT;

КОНЕЦ;

GKP1992

Публикация одного и того же вопроса дважды не приведет к получению результата в два раза быстрее. На самом деле, это будет препятствовать людям помогать вам. Пожалуйста, закройте один из вопросов.

Member 13777735

Получу ли я за это какую-нибудь помощь?

Member 13777735

Никто не может мне в этом помочь. Так что спасибо всем.

Member 13777735

Я завершил это сам собой.

Member 13777735

Прошу прощения за то же самое. На самом деле я думал, что мой аккаунт не создан должным образом. Поскольку я не получил никакого ответа от этого аккаунта, все равно он завершен на 1 день. Вот почему я снова отправил его с другого счета.

1 Ответов

Рейтинг:
2

Member 13777735

with src as (
Select 'A202 A202'                                                        as str from dual union all
Select 'Flat A202 Flat'                                                   as str from dual union all
Select 'The Old The Old'                                                  as str from dual union all
Select 'The Old Millers The Old'                                          as str from dual union all
Select 'The Old Millers The Old Millers'                                  as str from dual union all
Select 'The Old Cottage Millers The Old'                                  as str from dual union all
Select 'The Old Millers Cottage The Old Millers'                          as str from dual union all
Select 'The Old Millers Cottage Annex The Old'                            as str from dual union all
Select 'The Old Millers Cottage The Old Millers Cottage'                  as str from dual union all
Select 'The Old Millers Cottage Annex The Old Millers'                    as str from dual union all
Select 'The Old Cottage Wood Annex Hall The Old'                          as str from dual union all
Select 'The Old Millers Cottage Annex The Old Millers Cottage'            as str from dual union all
Select 'The Old Millers Cottage Wood Annex The Old Millers'               as str from dual union all
Select 'The Old Cottage Street Wood Annex Hall The Old'                   as str from dual union all
Select 'The Old Millers Cottage Annex The Old Millers Cottage Annex'      as str from dual union all
Select 'The Old Millers Cottage Wood Annex The Old Millers Cottage'       as str from dual union all
Select 'The Old Millers Cottage Wood Annex Hall The Old Millers'          as str from dual union all
Select 'The Old Millers Cottage Street Wood Annex Hall The Old'           as str from dual union all
Select 'The Old Millers Cottage Annex Hall The Old Millers Cottage Annex' as str from dual union all
Select 'The Old Millers Cottage Wood Annex Hall The Old Millers Cottage'  as str from dual union all
Select 'The Old Millers Cottage Street Wood Annex Hall The Old Millers'   as str from dual union all
Select 'The Old Millers Cottage Farm Street Wood Annex Hall The Old'      as str from dual
  )
  select listagg(str,' ') within group(order by r) str
  from
  (  select min(r) r, rn, str  from
 (
 SELECT rownum r, rn,
        REGEXP_SUBSTR (str, '[^ ]+',1,n) AS str
    FROM (select rownum rn, str from src) src,
(    SELECT LEVEL n
                 FROM DUAL,
                      (SELECT MAX (REGEXP_COUNT (str, ' ')) + 1 mcomma FROM src)
           CONNECT BY LEVEL <= mcomma) ctr
    WHERE ctr.n <= 1 + REGEXP_COUNT (str, ' ')
 ) group by rn, str) group by rn;