На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Можно ли расчистить помойку только средствами PL/SQL?
    Всем здравствуйте!
    Помойка - это поле комментариев в таблице объектов БД географических названий. На 95% эти комментарии - комментарии к НАЗВАНИЯМ.
    user posted image
    Возможен вариант ххххххххххххАбсолютная высота ННННмххххххххххххххх.
    К самим объектам относятся только сведения об абсолютных высотах. В общем тому, кто такое когда-то придумал, я бы ... :wacko:
    Хотелось бы сделать следующее:
    - добавить double-поле в таблицу объектов(это не проблема);
    - выбрать в него сами высоты (если они есть);
    - удалить эту подстроку из поля комментариев, а сами комментарии перенести в таблицу названий (это тоже не проблема);
    - далее комментарии также разделить на соответствующие поля - доп.источники, ударение, национальная форма (5 вариантов возможно).

    Можно ли такое сделать исключительно средствами PL/SQL Oracle 12 или проще написать примочку на C++ Билдере?
    ---
    Объём помойки ~ 800 000 записей.
    Сообщение отредактировано: #SI# -
      Цитата #SI# @
      Можно ли такое сделать исключительно средствами PL/SQL Oracle 12

      Можно. В чем проблема?
      Цитата #SI# @
      проще написать примочку на C++ Билдере?

      Тоже можно.

      Вопрос как разбирать
      Цитата #SI# @
      доп.источники, ударение, национальная форма (5 вариантов возможно).

      Разделители "." ";" "," только в приведенном примере а сколько их еще может быть или не быть.
      Цитата #SI# @
      далее комментарии также разделить на соответствующие поля - доп.источники, ударение, национальная форма (5 вариантов возможно).

      Можно в одну таблицу с признаком от 1 до 5.
        Цитата #SI# @
        Можно ли такое сделать исключительно средствами PL/SQL Oracle 12 или проще написать примочку на C++ Билдере?

        Я бы такую задачу решал бы на Perl'е, благо он именно на работу с текстом и заточен. Основной инструмент - набор регулярок, с помощью которых парсятся необходимые данные. Это наверное самое естественное применение Perl'а.
          Цитата #SI# @
          выбрать в него сами высоты (если они есть);

          ExpandedWrap disabled
            INSTR(поле,'Абсолютная высота') вернет позицию с какой вырезать
            INSTR(поле,'м.',INSTR(pole,'Абсолютная высота ')+LENGTH('Абсолютная высота ')) вернет позицию  "м."
            substr(поле,INSTR(поле,'Абсолютная высота'),INSTR(поле,'м.',INSTR(pole,'Абсолютная высота ')+LENGTH('Абсолютная высота '))+2) даст всю строку
          Сообщение отредактировано: Bas -
            Цитата Bas @
            Можно.
            Отлично! Фишка в том, что новая СУБД до сих пор не узаконена, поэтому пару раз в месяц перезагружаю сервер Oracle 12 данными и запускаю на нём процедуры чистки от лишних полей, лишних пробелов в строках и т.п... Минут 8 работает. Если смогу добавить туда этот "разбор полётов", то будет просто здорово.

            Цитата Bas @
            Разделители "." ";" "," только в приведенном примере а сколько их еще может быть или не быть.
            Поскольку набивали разные люди в течение 15 лет, то разделители могут быть, а могут и не быть. Человек-то на глаз поймёт... Может не быть разделительного пробела после значения высоты. В общем - возможны варианты.

            Цитата JoeUser @
            Я бы такую задачу решал бы на Perl'е
            Знаю, что есть такой язык. И это всё, что я о нём знаю :( .
            Сообщение отредактировано: #SI# -
              Цитата #SI# @
              Может не быть разделительного пробела после значения высоты. В общем - возможны варианты.

              Это не страшно, плохо когда нет "м." но тогда надо читать только цифры после высоты. Надо писать процедуру разбора строки.
              Сообщение отредактировано: Bas -
                Цитата Bas @
                Надо писать процедуру разбора строки.
                От этого я никуда не денусь :yes-sad: .
                  Цитата Bas @
                  плохо когда нет "м." но тогда надо читать только цифры после высоты
                  Свет не без добрых людей :D
                  ExpandedWrap disabled
                    create or replace procedure absHeight(str in varchar2, hei out varchar2) as
                      pos int;
                      hhh varchar2(50) := 'Абсолютная высота';
                      buf varchar2(1000);
                      dh  double precision;
                    begin
                      pos := instr(str, hhh);
                      if pos = 0
                        then hei := NULL;
                        return;
                      end if;
                      ----------------------------------------------------------
                      buf := substr(str, pos + length(hhh));
                      dh := to_number(regexp_replace(buf, '^[^0-9]*(.*[0-9])[^0-9]*$', '\1' ));  -- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                      hei := buf;
                    end;

                  Перепробовал все варианты возможной строки на входе - схавала всё!
                  Найдено тут - http://www.sql.ru/forum/760998/korrektnoe-...stroki-v-chislo.
                  ---
                  Теперь надо научиться выстригать этот фрагмент из общей строки на входе. Кое-какие мысли есть...
                  Сообщение отредактировано: #SI# -
                    Пока на коленке, малость корявенько, но надёжно (вроде бы???)
                    ExpandedWrap disabled
                      create or replace procedure absHeight(str in varchar2, notes out varchar2) as
                        pos int;
                        hhh varchar2(50) := 'Абсолютная высота';
                        buf varchar2(1000);
                        dh  double precision;
                        hei varchar2(100);
                        lenStr int;
                        lenHei int;
                        head varchar2(1000) := NULL;
                        tail varchar2(1000) := NULL;
                      begin
                        pos := instr(str, hhh);
                        if pos = 0
                          then hei := NULL;
                          return;
                        end if;
                        ----------------------------------------------------------
                        lenStr := length(str);
                        buf := substr(str, pos + length(hhh));
                        dh := to_number(regexp_replace(buf, '^[^0-9]*(.*[0-9])[^0-9]*$', '\1'));
                        hei := concat(hhh, to_number(dh, '99999D9'));  
                        lenHei := length(hei);
                        -- может быть хвост строки
                        tail := trim(substr(str, pos + lenHei + 1, lenStr));
                        -- может быть голова строки
                        if pos > 1
                          then head := trim(substr(str, 1, pos - 1));
                        end if;
                        -- в голове хвоста может быть остаток от описания высоты
                        if tail is not null
                          -- запятая и 0 могут остаться от числа с нулём в десятичной части - 1234,0 !!!
                          then tail := ltrim(tail, ',0мm. ');  -- вроде ничего другого к значению высоты не должны были приделать
                        end if;
                        -----------------------------------------------------------
                        if head is not null and tail is not null
                          then notes := concat(head, ' ' || tail);
                        elsif head is not null
                          then notes := head;
                        elsif tail is not null
                          then notes := tail;
                        else notes := NULL;
                        end if;
                      end;


                    Добавлено
                    Принципиально вопрос решён, всем спасибо! :thanks:
                    Сообщение отредактировано: #SI# -
                      Реально работающий код.
                      Процедура отбора объектов с возможными данными об абсолютной высоте:
                      ExpandedWrap disabled
                        procedure updAbsHeight as
                          cursor cur is select reg_n
                                          from gn.geoobject
                                         where actual = 1 and code_kind_geoobject in (29, 39, 93, 135, 140, 141, 146, 148, 190, 191, 196, 197, 216, 221, 224);
                          reg_n int;
                        begin
                          open cur;
                          loop
                            fetch cur into reg_n;
                            exit when cur%NOTFOUND;
                            setAbsHeight(reg_n);
                          end loop;
                          close cur;
                        end updAbsHeight;

                      и (сорри за портянку) процедура разделения данных:
                      ExpandedWrap disabled
                        procedure setAbsHeight(REG_ID in int) as
                          objNotes  varchar2(2000);
                          lenNotes  int;
                          absHMark  varchar2(20) := 'Абсолютная высота';
                          markPos   int;
                          vMin      int;
                          buf       varchar2(2000);
                          dValue    varchar2(10);
                          dblHei    number(8, 1);
                          strHei    varchar2(50);
                          lenHei    int;
                          head      varchar2(2000);
                          tail      varchar2(2000);
                          comments  varchar2(2000);
                          err       varchar2(200);
                        begin
                          err := concat('Ошибка в процедуре gn_modify.setAbsHeight REG_N = ', to_char(REG_ID));
                          --=========================================================================
                          select notes into objNotes from gn.geoobject where reg_n = REG_ID;
                          if objNotes is null
                            then return;
                          end if;
                          ---------------------------------------------------------------------------
                          markPos := instr(objNotes, absHMark);
                          if markPos = 0
                            then return;
                          end if;
                          --=========================================================================
                          lenNotes := length(objNotes);
                          buf := substr(objNotes, markPos + length(absHMark));
                          vMin := instr(buf, '.');   -- заменить десятичную точку на запятую
                          if vMin > 0 then
                            buf := regexp_replace(buf, '.', ',', vMin, 1);
                          end if;
                          ---------------------------------------------------------------------------
                          vMin := 0;
                          if instr(buf, ' - ') = 1 or instr(buf, '- ') = 1
                            then null;
                          else begin
                                 vMin := instr(buf, '-');
                                 if vMin > 0 and substr(buf, vMin + 1) between '1' and '9'
                                   then vMin := 1;
                                   else vMin := 0;
                                 end if;  
                               end;
                          end if;
                          ---------------------------------------------------------------------------
                          -- в буфере помимо значения высоты могут быть ещё цифры - чей-нибудь год издания етс... или нихрена там нет!
                          dValue := substr(buf, 1, 10);
                          -- фак! 'Абсолютная высота м' !!!
                          if substr(dValue, 1, 1) not between '1' and '9'
                            then dValue := '0';
                            -- фак-фак-фак! Проверить на пробел внутри цифири!!! 'Абсолютная высота 736, 5 м' !!!
                            -- http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=88473&msg=643244
                            else dValue := replace(replace(replace(dValue, ' ', chr(0)), chr(0)), chr(0));  
                          end if;  
                          -- то, что осталось в подстроке - в число:
                          dblHei := to_number(regexp_replace(dValue/*buf*/, '^[^0-9]*(.*[0-9])[^0-9]*$', '\1'));
                          if vMin = 1
                            then dblHei := dblHei * -1;
                          end if;  
                          strHei := concat(absHMark, ' ' || to_char(dblHei, 'FM99999D9')); -- FM убирает лидирующие пробелы (и нули - если они есть)
                          lenHei := length(strHei);
                          ---------------------------------------------------------------------------
                          -- может быть хвост строки
                          tail := trim(substr(objNotes, markPos + lenHei + 1, lenNotes));
                          -- может быть голова строки
                          if markPos > 1
                            then head := trim(substr(objNotes, 1, markPos - 1));
                          end if;
                          -- в голове хвоста может быть остаток от описания высоты
                          if tail is not null
                            -- запятая и цифры могут остаться от числа с нулём в десятичной части или из-за некорректной позиции дефиса перед значением высоты
                            then tail := ltrim(tail, ',0123456789мm. ');  -- вроде ничего другого к значению высоты не должны были приделать
                          end if;
                          ---------------------------------------------------------------------------
                          -- собрать до кучи то, что могло остаться
                          if head is not null and tail is not null
                            then comments := concat(head, ' ' || tail);
                          elsif head is not null
                            then comments := head;
                          elsif tail is not null
                            then comments := tail;
                          else comments := NULL;
                          end if;
                          ---------------------------------------------------------------------------
                          update gn.geoobject
                             set notes = comments, abs_hei = dblHei
                           where reg_n = REG_ID;  
                          commit;  
                          --=========================================================================
                          exception when others  
                            then raise_application_error(-20001, err || chr(13) || chr(10) || SQLERRM);  
                        end setAbsHeight;
                        Сорри за оффтоп - есть официальное (нормализованное) название объекта. Есть его некий источник - например Указ о переименовании Ленинграда в Санкт-Петербург. И есть информация о том, что такое название есть не только в этом Указе - так называемые Дополнительные источники нормализованного названия. Вместо того, чтобы эту инфу ввести в отдельное поле, она свалена в общее поле примечаний к объекту. А чтобы в отчёте вывелось именно то, что это Дополнительные ... , лабухи, клепавшие базу, сварганили для поля примечаний возможность записи стандартных фраз из самопальных словарей. Вот результат:
                        ExpandedWrap disabled
                          procedure set_aux_name_src as
                          begin
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Дополнительные источники нормализованного названия', '<NAME>') where instr(notes_lmm, 'Дополнительные источники нормализованного названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'дополнительные источники нормализованного названия', '<NAME>') where instr(notes_lmm, 'дополнительные источники нормализованного названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Дополнительные источники норм. названия', '<NAME>') where instr(notes_lmm, 'Дополнительные источники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Дополнительные источники норм.названия', '<NAME>') where instr(notes_lmm, 'Дополнительные источники норм.названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'дополнительные источники норм. названия', '<NAME>') where instr(notes_lmm, 'дополнительные источники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'дополнительные источники норм.названия', '<NAME>') where instr(notes_lmm, 'дополнительные источники норм.названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Дополнительные норм.названия', '<NAME>') where instr(notes_lmm, 'Дополнительные норм.названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Дополнительные источники названия', '<NAME>') where instr(notes_lmm, 'Дополнительные источники названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Дополнительные источ', '<NAME>') where instr(notes_lmm, 'Дополнительные источ') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Дополн. источники норм. названия', '<NAME>') where instr(notes_lmm, 'Дополн. источники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп источники нормализованного названия', '<NAME>') where instr(notes_lmm, 'Доп источники нормализованного названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп. источники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм. названий', '<NAME>') where instr(notes_lmm, 'Доп.источники норм. названий') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм. название', '<NAME>') where instr(notes_lmm, 'Доп.источники норм. название') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм.названия', '<NAME>') where instr(notes_lmm, 'Доп. источники норм.названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источника норм.названия', '<NAME>') where instr(notes_lmm, 'Доп.источника норм.названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм.названия', '<NAME>') where instr(notes_lmm, 'Доп.источники норм.названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп источники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп источники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники нором. названия', '<NAME>') where instr(notes_lmm, 'Доп. источники нором. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм. анзвания', '<NAME>') where instr(notes_lmm, 'Доп. источники норм. анзвания') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм. нозвания', '<NAME>') where instr(notes_lmm, 'Доп. источники норм. нозвания') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм. Названия', '<NAME>') where instr(notes_lmm, 'Доп.источники норм. Названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'доп.источники норм названия', '<NAME>') where instr(notes_lmm, 'доп.источники норм названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'доп.источники норм. названия', '<NAME>') where instr(notes_lmm, 'доп.источники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники нрм.названия', '<NAME>') where instr(notes_lmm, 'Доп.источники нрм.названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм.', '<NAME>') where instr(notes_lmm, 'Доп.источники норм.') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм.названия;', '<NAME>') where instr(notes_lmm, 'Доп.источники норм.названия;') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источникинорм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источникинорм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. И;сточники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп. И;сточники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм. Названия;', '<NAME>') where instr(notes_lmm, 'Доп.источники норм. Названия;') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. норм. названия', '<NAME>') where instr(notes_lmm, 'Доп. норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. Источник;и норм. названия', '<NAME>') where instr(notes_lmm, 'Доп. Источник;и норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. Источники; норм. названия', '<NAME>') where instr(notes_lmm, 'Доп. Источники; норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. Ист. н. н.', '<NAME>') where instr(notes_lmm, 'Доп. Ист. н. н.') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм. названи', '<NAME>') where instr(notes_lmm, 'Доп.источники норм. названи') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм. значения', '<NAME>') where instr(notes_lmm, 'Доп. источники норм. значения') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источеики ном. названия', '<NAME>') where instr(notes_lmm, 'Доп.источеики ном. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.Я норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.Я норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники нормал. названия', '<NAME>') where instr(notes_lmm, 'Доп.источники нормал. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.ир норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.ир норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм. ир', '<NAME>') where instr(notes_lmm, 'Доп.источники норм. ир') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники но;1998;звания', '<NAME>') where instr(notes_lmm, 'Доп.источники но;1998;звания') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. Источники норм. yазвания', '<NAME>') where instr(notes_lmm, 'Доп. Источники норм. yазвания') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм. yазвания', '<NAME>') where instr(notes_lmm, 'Доп. источники норм. yазвания') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. Источники норм.yазвания', '<NAME>') where instr(notes_lmm, 'Доп. Источники норм.yазвания') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. Источники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп. Источники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм названия', '<NAME>') where instr(notes_lmm, 'Доп. источники норм названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм.', '<NAME>') where instr(notes_lmm, 'Доп. источники норм.') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм', '<NAME>') where instr(notes_lmm, 'Доп.источники норм') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источ;ики норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источ;ики норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. Ист; очники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп. Ист; очники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники нрм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источники нрм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники. названия', '<NAME>') where instr(notes_lmm, 'Доп.источники. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источн;ки норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источн;ки норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источнки норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источнки норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источнии норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источнии норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источник норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источник норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.истоники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.истоники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм названия', '<NAME>') where instr(notes_lmm, 'Доп.источники норм названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. Источники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп. Источники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм. навания', '<NAME>') where instr(notes_lmm, 'Доп. источники норм. навания') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источник норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источник норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.ис; то;m ,чники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.ис; то;m ,чники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. сточники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп. сточники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп .источники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп .источники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм. названиz', '<NAME>') where instr(notes_lmm, 'Доп. источники норм. названиz') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм. Названия', '<NAME>') where instr(notes_lmm, 'Доп. источники норм. Названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.иточники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.иточники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источнки норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источнки норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм. названи', '<NAME>') where instr(notes_lmm, 'Доп. источники норм. названи') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм. назван', '<NAME>') where instr(notes_lmm, 'Доп. источники норм. назван') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.истоники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.истоники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источни норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источни норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источнки норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источнки норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источнии норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источнии норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'доп. источники норм. названия', '<NAME>') where instr(notes_lmm, 'доп. источники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источнии норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источнии норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.истчники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.истчники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники ро. названия', '<NAME>') where instr(notes_lmm, 'Доп.источники ро. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники нор. названия', '<NAME>') where instr(notes_lmm, 'Доп.источники нор. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источник норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.источник норм. названия') > 0;
                            commit;  
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. иcточники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп. иcточники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.и сточники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.и сточники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'доп.источники норм. Названия', '<NAME>') where instr(notes_lmm, 'доп.источники норм. Названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'доп.источники норм.названия', '<NAME>') where instr(notes_lmm, 'доп.источники норм.названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.и сточники норм. названия', '<NAME>') where instr(notes_lmm, 'Доп.и сточники норм. названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источник нормативного названия', '<NAME>') where instr(notes_lmm, 'Доп. источник нормативного названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп источники норм названия', '<NAME>') where instr(notes_lmm, 'Доп источники норм названия') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники норм', '<NAME>') where instr(notes_lmm, 'Доп. источники норм') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники норм', '<NAME>') where instr(notes_lmm, 'Доп.источники норм') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.источники', '<NAME>') where instr(notes_lmm, 'Доп.источники') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп. источники', '<NAME>') where instr(notes_lmm, 'Доп. источники') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, 'Доп.ист', '<NAME>') where instr(notes_lmm, 'Доп.ист') > 0;
                            commit;
                            ---------------------------------------------------------------------------
                            -- сразу убрать мусор, могут быть просто пустышки (реально - 2673 строки)
                            update gn.geoobject
                               set notes_lmm = null
                             where instr(notes_lmm, '<NAME>', 1, 1) = instr(notes_lmm, '<NAME>', -1, 1) and instr(notes_lmm, '<NAME>', 1, 1) = (length(notes_lmm) - length('<NAME>') + 1);
                            commit;
                            ---------------------------------------------------------------------------
                            update gn.geoobject set notes_lmm = replace(notes_lmm, '>:', '>') where instr(notes_lmm, '>:') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, '<NAME>**', '<NAME>') where instr(notes_lmm, '<NAME>**') > 0;
                            commit;
                            update gn.geoobject set notes_lmm = replace(notes_lmm, '**<NAME>', '<NAME>') where instr(notes_lmm, '**<NAME>') > 0;
                            commit;
                          end set_aux_name_src;

                        В общем - распахал. Один раз можно. Было даже интересно собрать варианты :D !
                        Чисто теоретический вопрос - можно ли в Oracle с его регулярками в PL/SQL сделать это более изящно?
                          Цитата #SI# @
                          Чисто теоретический вопрос

                          Можно lower, upper использовать, пару апдейтом можно сэкономить.
                          Цитата #SI# @
                          можно ли в Oracle с его регулярками в PL/SQL сделать это более изящно?

                          Это очень уж теоретически, приведение всех "самопальных словарей"
                          (добавить поле которое все эти фразы
                          Цитата
                          Доп.источники ро. названия
                          Доп.источники нор. названия
                          Доп.источник норм. названия
                          Доп. источник норм. названия

                          )привело к единому стандарту, без ручной работы не обойтись, и апдейт уже на основе этих справочников.
                          Сообщение отредактировано: Bas -
                            Цитата Bas @
                            Можно lower, upper использовать, пару апдейтом можно сэкономить.
                            В принципе - можно. Другой вопрос - на сколько производительность упадёт за счёт преобразований регистра? Разовая работа, проверять, честно говоря, просто лень! :D
                            Цитата Bas @
                            без ручной работы не обойтись
                            Эт точно - неделю выборки делал :wall: ! Там же кроме Дополнительных источников... есть ещё много чего "стандартного"...
                              Цитата #SI# @
                              Разовая работа, проверять, честно говоря, просто лень!

                              Никогда не заморачивался на эту тему, надо у Тома Кейта спросить - должен знать ;) .

                              Цитата #SI# @
                              Там же кроме Дополнительных источников... есть ещё много чего "стандартного"...

                              Так я о том же, писали знатоки нормальных форм и структурированных блоб(мемо)полей.
                              Сообщение отредактировано: Bas -
                                Можно было бы эту "помойку" разобрать через REGEXP_REPLACE (появилась в десятке, кажется), за одно и по тренироваться в применении .
                                Сообщение отредактировано: Bas -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0581 ]   [ 15 queries used ]   [ Generated: 24.04.24, 16:09 GMT ]