powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Многократные замены
13 сообщений из 13, страница 1 из 1
Многократные замены
    #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
Многократные замены
    #39370286
Версия Oracle:
Код: plsql
1.
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
...
Рейтинг: 0 / 0
Многократные замены
    #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
Многократные замены
    #39370295
MaybeTak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имхо, засунуть сокращения в коллекцию в пакете на постоянке + детерминистик функция с пробегом по коллекции и реплейсом и не париться )
...
Рейтинг: 0 / 0
Многократные замены
    #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
Многократные замены
    #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
Многократные замены
    #39370348
AmKad, то что надо! Спасибо за оперативный ответ.
...
Рейтинг: 0 / 0
Многократные замены
    #39370357
Задумалась над запросомто что надо!
Неужели вся база в таких запросах?
...
Рейтинг: 0 / 0
Многократные замены
    #39370384
Тоже задумался,

задача разовой обработки.
...
Рейтинг: 0 / 0
Многократные замены
    #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
Многократные замены
    #39370582
Руслан Дамирович,

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


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