Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Многократные замены / 13 сообщений из 13, страница 1 из 1
19.12.2016, 15:05
    #39370248
Многократные замены
Помогите написать запрос.

Имеется один объект, в котором есть полные наименования административных единиц в одно слово (или несколько). По сути представляет собой иерархию населенного пункта.

Так же имеется словарь сокращений. Необходимо каждой записи с полным путем, сопоставить запись с сокращениями. Для тех слов, которым не нашлось сокращение - оставить полное слово.

Т.е
для "ГородРегионПоселок" это будет "Гор Рег Пос"
для "Хутор Село" это будет "Хутор С"

Сделала для варианта, когда есть сокращения для каждого из слова. Зависла на том, когда нет слова с справочнике сокращений (На примере Хутора).

Мой запрос:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with
  t_what(what) as 
    (
      select 'ГородРегионПоселок'   from dual union all
      select 'КрайОбласть Район'    from dual union all
      select 'Хутор Село'           from dual
    ),
  t_dict(full_name, short_name) as
    (
      select 'Город'    , 'Гор' from dual union all
      select 'Регион'   , 'Рег' from dual union all
      select 'Поселок'  , 'Пос' from dual union all
      select 'Край'     , 'К'   from dual union all
      select 'Область'  , 'Обл' from dual union all
      select 'Район'    , 'Рай' from dual union all
      select 'Село'     , 'С'   from dual
    )
select
  what,
  listagg(short_name, ' ')  within group (order by instr(what, full_name)) as finish_result
from t_what left join t_dict on instr(what, full_name) <> 0
group by what;



WHAT FINISH_RESULTГородРегионПоселок Гор Рег ПосКрайОбласть Район К Обл РайХутор Село С

Хутора нет в справочнике сокращений, поэтому он не подхватился. А мне в этом случае нужно, чтобы он остался в исходном виде.

Заранее спасибо.
...
Рейтинг: 0 / 0
19.12.2016, 15:25
    #39370286
Многократные замены
Версия Oracle:
Код: plsql
1.
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
...
Рейтинг: 0 / 0
19.12.2016, 15:31
    #39370292
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократные замены
Сверстал на коленке для (размер справочника не более 999 элементов - можешь уменьшить/увеличить соотв-е значение)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
with
  t_what(what) as
    (
      select 'ГородРегионПоселок'   from dual union all
      select 'КрайОбласть Район'    from dual union all
      select 'Хутор Село'           from dual
    ),
  t_dict(full_name, short_name) as
    (
      select 'Город'    , 'Гор' from dual union all
      select 'Регион'   , 'Рег' from dual union all
      select 'Поселок'  , 'Пос' from dual union all
      select 'Край'     , 'К'   from dual union all
      select 'Область'  , 'Обл' from dual union all
      select 'Район'    , 'Рай' from dual union all
      select 'Село'     , 'С'   from dual
    )
select rn, old_what, rtrim(new_what) as new_what
from t_what
model
reference t_d on (select t.*, rownum rn from t_dict t)
dimension by (rn) measures (full_name, short_name)
main t_w dimension by (rownum rn) measures (what old_what, what new_what)
rules iterate (999)
(new_what[any] = replace(new_what[cv()], full_name[iteration_number], short_name[iteration_number] || ' ')
);

        RN OLD_WHAT           NEW_WHAT
---------- ------------------ ------------------
         1 ГородРегионПоселок Гор Рег Пос
         2 КрайОбласть Район  К Обл  Рай
         3 Хутор Село         Хутор С
...
Рейтинг: 0 / 0
19.12.2016, 15:33
    #39370295
MaybeTak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократные замены
Имхо, засунуть сокращения в коллекцию в пакете на постоянке + детерминистик функция с пробегом по коллекции и реплейсом и не париться )
...
Рейтинг: 0 / 0
19.12.2016, 16:00
    #39370330
MaybeTak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократные замены
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
SQL> CREATE OR REPLACE PACKAGE PKG_SHORT IS
  2     FUNCTION GET_SHORT(P_FULL VARCHAR2) RETURN VARCHAR2 DETERMINISTIC;
  3  END;
  4  /
 
Package created
SQL> CREATE OR REPLACE PACKAGE BODY PKG_SHORT
  2  IS
  3     v_full  SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST('Город', 'Регион', 'Поселок', 'Край', 'Область', 'Район', 'Село');
  4     v_short SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST('Гор',   'Рег',    'Пос',     'К',    'Обл',     'Рай',   'С');
  5  
  6     FUNCTION GET_SHORT(P_FULL VARCHAR2) RETURN VARCHAR2 DETERMINISTIC
  7     IS
  8        v_res VARCHAR2(2000) := P_FULL;
  9     BEGIN
 10        FOR g IN v_full.FIRST..v_full.LAST
 11        LOOP
 12           v_res := REPLACE(v_res, v_full(g), v_short(g) || ' ');
 13        END LOOP;
 14  
 15        RETURN v_res;
 16     END;
 17  END;
 18  /
 
Package body created
SQL> WITH t_what(what) as  (SELECT 'ГородРегионПоселок'   FROM dual UNION ALL
  2                         SELECT 'КрайОбласть Район'    FROM dual UNION ALL
  3                         SELECT 'Хутор Село'           FROM dual)
  4  SELECT pkg_short.get_short(what) FROM t_what
  5  /
 
PKG_SHORT.GET_SHORT(WHAT)
--------------------------------------------------------------------------------
Гор Рег Пос
К Обл  Рай
Хутор С


Плюсы: просто и возможно, эффективно.
Минусы: все-таки справочник хранить в пакете не очень удобно )
...
Рейтинг: 0 / 0
19.12.2016, 16:05
    #39370337
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократные замены
Немного соптимизировал свое решение
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
with
  t_what(what) as
    (
      select 'ГородРегионПоселок'   from dual union all
      select 'КрайОбласть Район'    from dual union all
      select 'Хутор Село'           from dual
    ),
  t_dict(full_name, short_name) as
    (
      select 'Город'    , 'Гор' from dual union all
      select 'Регион'   , 'Рег' from dual union all
      select 'Поселок'  , 'Пос' from dual union all
      select 'Край'     , 'К'   from dual union all
      select 'Область'  , 'Обл' from dual union all
      select 'Район'    , 'Рай' from dual union all
      select 'Село'     , 'С'   from dual
    )
select rn, old_what, rtrim(new_what) as new_what
from t_what
model
reference t_d on (select t.*, rownum rn from t_dict t)
dimension by (rn) 
measures (full_name, short_name) unique single reference
main t_w 
dimension by (rownum rn) 
measures (what old_what, what new_what) unique single reference
rules iterate (999999999) until presentv(full_name[iteration_number + 1], 1, 0) = 0
(new_what[any] =  replace(new_what[cv()], full_name[iteration_number + 1], short_name[iteration_number + 1] || ' ')
);
...
Рейтинг: 0 / 0
19.12.2016, 16:15
    #39370348
Многократные замены
AmKad, то что надо! Спасибо за оперативный ответ.
...
Рейтинг: 0 / 0
19.12.2016, 16:20
    #39370357
Многократные замены
Задумалась над запросомто что надо!
Неужели вся база в таких запросах?
...
Рейтинг: 0 / 0
19.12.2016, 16:39
    #39370384
Многократные замены
Тоже задумался,

задача разовой обработки.
...
Рейтинг: 0 / 0
19.12.2016, 17:48
    #39370449
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократные замены
Если вы пробуете что-то привести к виду ФИАС, то возможно не стоит городить свои преобразования?
край - край
район - рн
хутор - х
а еще забыли
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
аал
АО
Аобл
аул
волость
высел
г
городок
д
дп
ж/д_будка
ж/д_казарм
ж/д_оп
ж/д_пост
ж/д_рзд
ж/д_ст
заимка
казарма
кп
край
м
мкр
нп
обл
п
п/о
п/р
п/ст
пгт
починок
промзона
Респ
рзд
р-н
рп
с
с/о
сл
ст
ст-ца
тер
у
х

...
Рейтинг: 0 / 0
19.12.2016, 20:25
    #39370582
Многократные замены
Руслан Дамирович,

Вы действительно думаете, что в тестовом запросе из дуала мне нужные все значения ФИАС? Сокращения так же придуманы из головы.
...
Рейтинг: 0 / 0
19.12.2016, 23:20
    #39370631
пгт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократные замены
Задумалась над запросомСокращения так же придуманы из головы.Тогда важно, чтобы голова думала в правильном направлении, а то каша получится.
...
Рейтинг: 0 / 0
20.12.2016, 10:50
    #39370794
NETClient
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократные замены
пгтЗадумалась над запросомСокращения так же придуманы из головы.Тогда важно, чтобы голова думала в правильном направлении, а то каша получится.Да, справочник замен надо будет отсортировать в правильном порядке.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Многократные замены / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]