powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Объединение полей с с форматированием
4 сообщений из 4, страница 1 из 1
Объединение полей с с форматированием
    #39540181
Rezident_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья, добрый день!
Может кто подскажет путь решения проблемы.
Есть view, в которой четыре поля: Объект, Фамилия, Имя, Отчество - это ответственные за один объект, причем их может быть несколько.
Записаны они под номером и через точку с запятой. Вот пример данных:
OBJECT LNAME FNAME MNAME1 1.Иванов;2.Петров;3.Сидоров 1.Иван;2.Петр;3.Михаил 1.Иванович;2.Петрович;3.Михайлович2 1.Кузнецов;2.Смирнов;3.Васильев 1.Владимир;2.Илья;3.Дмитрий 1.Алексеевич;2.Николаевич

Мне нужно получить новое поле с ФИО каждого, т.е.
OBJECT FIO1 1.Иванов Иван Иванович;2.Петров Петр Петрович;3.Сидоров Михаил Михайлович2 1.Кузнецов Владимир Алексеевич;2.Смирнов Илья Николаевич;3.Васильев Дмитрий
Подскажите, в какую сторону копать, думал сначала убрать числа и точки, а потом разделить строку на несколько строк по символу ";", а потом уже объединить, какой лучше оператор применить в этой ситуации?
...
Рейтинг: 0 / 0
Объединение полей с с форматированием
    #39540195
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Способов заметно более одного.
Наиболее эффективно было бы функцию накидать.
Но можно и так:
Код: 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.
with t as (select 1 OBJECT, '1.Иванов;2.Петров;3.Сидоров' LNAME, '1.Иван;2.Петр;3.Михаил' FNAME, '1.Иванович;2.Петрович;3.Михайлович' MNAME
from dual union all select 2, '1.Кузнецов;2.Смирнов;3.Васильев', '1.Владимир;2.Илья;3.Дмитрий', '1.Алексеевич;2.Николаевич'
from dual
)
, tt (object, lname, fname, mname, fio)  as (
  select object
    , regexp_replace(lname, '[^;]+;?','',1,1)
    , regexp_replace(fname, '[^;]+;?','',1,1)
    , regexp_replace(mname, '[^;]+;?','',1,1)
    , regexp_substr(lname, '\d+\.([^;]+)',1,1)
    ||' '||regexp_substr(fname, '\d+\.([^;]+)',1,1,null,1) 
    ||' '||regexp_substr(mname, '\d+\.([^;]+)',1,1,null,1) fio
    from t
  union all
  select tt.object
       , regexp_replace(tt.lname, '[^;]+;?','',1,1)
       , regexp_replace(tt.fname, '[^;]+;?','',1,1)
       , regexp_replace(tt.mname, '[^;]+;?','',1,1)
    , regexp_substr(tt.lname, '\d+\.([^;]+)',1,1)
    ||' '||regexp_substr(tt.fname, '\d+\.([^;]+)',1,1,null,1) 
    ||' '||regexp_substr(tt.mname, '\d+\.([^;]+)',1,1,null,1) fio
    from t, tt 
   where t.object = tt.object and coalesce(trim(tt.lname),trim(tt.fname),trim(tt.mname)) is not null
)
select object, listagg(fio,';') within group (order by fio) fio 
from tt
group by object;

OBJECT	FIO
1	1.Иванов Иван Иванович;2.Петров Петр Петрович;3.Сидоров Михаил Михайлович
2	1.Кузнецов Владимир Алексеевич;2.Смирнов Илья Николаевич;3.Васильев Дмитрий 
...
Рейтинг: 0 / 0
Объединение полей с с форматированием
    #39540196
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парсинг в функции регэкспами - только ради примера.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with  function f(lname varchar2, fname varchar2, mname varchar2) return varchar2 is
r varchar2(4000)
; iter number := 1
; begin 
loop   r := r || regexp_substr(lname, '\d+\.([^;]+)',1,iter)
    ||' '||regexp_substr(fname, '\d+\.([^;]+)',1,iter,null,1) 
    ||' '||regexp_substr(mname, '\d+\.([^;]+)',1,iter,null,1)
    ||';'
; iter := iter + 1
; exit when instr(lname,'.',1, iter) <=0 or iter > 15
; end loop
; return rtrim(r,';')
; end
; select object, f(lname,fname,mname) fio 
    from (select 1 OBJECT, '1.Иванов;2.Петров;3.Сидоров' LNAME, '1.Иван;2.Петр;3.Михаил' FNAME, '1.Иванович;2.Петрович;3.Михайлович' MNAME
            from dual union all select 2, '1.Кузнецов;2.Смирнов;3.Васильев', '1.Владимир;2.Илья;3.Дмитрий', '1.Алексеевич;2.Николаевич'
            from dual) t
/

OBJECT	FIO
1	1.Иванов Иван Иванович;2.Петров Петр Петрович;3.Сидоров Михаил Михайлович
2	1.Кузнецов Владимир Алексеевич;2.Смирнов Илья Николаевич;3.Васильев Дмитрий 
...
Рейтинг: 0 / 0
Объединение полей с с форматированием
    #39540316
Rezident_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

То, что нужно, преогромнейшее спасибо! Начал форматировать с помощью regexp_replace, но застрял на моменте разделения данных, а тут все понятно, все по полочкам, спасибо еще раз.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Объединение полей с с форматированием
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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