powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Интересная задача с преобразованием строки в XML
12 сообщений из 12, страница 1 из 1
Интересная задача с преобразованием строки в XML
    #39317394
Sergey_2583
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет, есть вот такие исходные данные:

create table test
(
ID number,
Str varchar2(2000)
)

insert into test
values (1, 'aaa, bbb, ccc, ddd');

insert into test
values (2, 'aaa');

нужно данные в колонке STR преобразовать таким образом, чтобы получилось следующее:

<Referance _Name="aaa" _Type="AKA" /><<Referance _Name="bbb" _Type="AKA" /><Referance _Name="ccc" _Type="IDENTITY" /><Referance _Name="ddd" _Type="AKA" />

Значение в теге _TYPE должно формироваться в зависимости от того, совпадает слово между запятыми с некоторой строкой, которую мы получили в качестве входного параметра.

Решение с loop и функцией уже есть, может эту задачу можно как-то решить с помощью регулярных выражений или XMLAGG, но что-то как-то у меня пока не получилось.

Заранее благодарен за Ваши предложения по решению данной задачи.
...
Рейтинг: 0 / 0
Интересная задача с преобразованием строки в XML
    #39317395
Sergey_2583
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
немного уточню, между запятыми может быть несколько слов, немного уточнённый мой пример:

insert into test
values (1, 'aaa qqq, bbb ooo kkk, ccc bbb rrr, ddd');

например мы получили на вход строку ccc bbb rrr, результат должен быть следующий:

<Referance _Name="aaa qqq" _Type="AKA" /><<Referance _Name="bbb ooo kkk" _Type="AKA" /><Referance _Name="ccc bbb rrr" _Type="IDENTITY" /><Referance _Name="ddd" _Type="AKA" />
...
Рейтинг: 0 / 0
Интересная задача с преобразованием строки в XML
    #39317397
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый обыкновенный REGEXP_REPLACE:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select  id,
        regexp_replace(str,'([^,]+)(, |$)','<Reference _Name="\1" _Type="AKA" />') new_str
  from  test
/

        ID NEW_STR
---------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         1 <Reference _Name="aaa qqq" _Type="AKA" /><Reference _Name="bbb ooo kkk" _Type="AKA" /><Reference _Name="ccc bbb rrr" _Type="AKA" /><Reference _Name="ddd" _Type="AKA" />

SQL>



SY.
...
Рейтинг: 0 / 0
Интересная задача с преобразованием строки в XML
    #39317428
Sergey_2583
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY, не совсем, нет сравнения с входной строкой, для одного тега _type должен принять другое значение
...
Рейтинг: 0 / 0
Интересная задача с преобразованием строки в XML
    #39317733
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with 
param as ( select 'aaa' keyvalue from dual )
,slist as( select 'aaa, bbb, ccc, ddd' elems from dual )
,stable as(
  select trim(regexp_substr(slist.elems,'[^,]+', 1, level)) elem from dual,slist
  connect by regexp_substr(slist.elems, '[^,]+', 1, level) is not null
)
,xtable as(
  select 
    xmlagg(
      xmlelement("Referance",
        XMLATTRIBUTES(
          stable.elem as "_Name",
          case when stable.elem=param.keyvalue then 'IDENTITY' else 'AKA' end as "_Type"
        )
      )
    ) as xml
  from stable,param
)
select xml from xtable
...
Рейтинг: 0 / 0
Интересная задача с преобразованием строки в XML
    #39317741
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и для красоты :)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with 
param as ( select 'aaa' keyvalue from dual )
,slist as( select 'aaa, bbb, ccc, ddd' elems from dual )
,stable as(
  select trim(regexp_substr(slist.elems,'[^,]+', 1, level)) elem from dual,slist
  connect by regexp_substr(slist.elems, '[^,]+', 1, level) is not null
)
,xtable as(
  select 
    xmlagg(
      xmlelement("Referance",
        XMLATTRIBUTES(
          stable.elem as "_Name",
          decode(stable.elem,param.keyvalue,'IDENTITY','AKA') as "_Type"
        )
      )
    ) as xml
  from stable,param
)
select XMLSERIALIZE(CONTENT xml as CLOB INDENT) from xtable
...
Рейтинг: 0 / 0
Интересная задача с преобразованием строки в XML
    #39317753
tokenize+flwor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry.,

громоздко
...
Рейтинг: 0 / 0
Интересная задача с преобразованием строки в XML
    #39317970
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_2583SY, не совсем, нет сравнения с входной строкой, для одного тега _type должен принять другое значение

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
variable token varchar2(20)
exec :token := 'ccc bbb rrr';
select  id,
        replace(
                regexp_replace(str,'([^,]+)(, |$)','<Reference _Name="\1" _Type="AKA" />'),
                '<Reference _Name="' || :token || '" _Type="AKA" />',
                '<Reference _Name="' || :token || '" _Type="IDENTITY" />'
               ) new_str
  from  test
/

        ID NEW_STR
---------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         1 <Reference _Name="aaa qqq" _Type="AKA" /><Reference _Name="bbb ooo kkk" _Type="AKA" /><Reference _Name="ccc bbb rrr" _Type="IDENTITY" /><Reference _Name="ddd" _Type="AKA" />

SQL> 



SY.
...
Рейтинг: 0 / 0
Интересная задача с преобразованием строки в XML
    #39318003
Sergey_2583
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь
...
Рейтинг: 0 / 0
Интересная задача с преобразованием строки в XML
    #39318022
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_2583Спасибо за помощь

XQUERY:

Код: 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.
variable token varchar2(20)
exec :token := 'ccc bbb rrr';
select  id,
        xmlquery(
                 '
                  for $c at $i in ora:tokenize($str,", ")
                  where $i != 1
                  return if ( $token = $c )
                           then
                             <Reference _Name="{$c}" _Type="IDENTITY" />
                           else
                             <Reference _Name="{$c}" _Type="IDENTITY" />
                 '
                 passing ', ' || str as "str",
                         :token as "token"
                 returning content
                ) new_str
  from  test
/

        ID NEW_STR
---------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         1 <Reference _Name="aaa qqq" _Type="AKA"></Reference><Reference _Name="bbb ooo kkk" _Type="AKA"></Reference><Reference _Name="ccc bbb rrr" _Type="IDENTITY"></Reference><Reference _Name="ddd" _Type="AKA"></Reference>


SQL> 



SY.
...
Рейтинг: 0 / 0
Интересная задача с преобразованием строки в XML
    #39318128
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
if ( $token = $c )
                           then
                             <Reference _Name="{$c}" _Type="IDENTITY" />
                           else
                             <Reference _Name="{$c}" _Type="IDENTITY" />

        ID NEW_STR
---------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         1 <Reference _Name="aaa qqq" _Type="AKA"></Reference>...</Reference><Reference _Name="ccc bbb rrr" _Type="IDENTITY"></Reference><Reference _Name="ddd" _Type="AKA"></Reference>



Ну как тут не вспомнить Станиславского...
...
Рейтинг: 0 / 0
Интересная задача с преобразованием строки в XML
    #39318135
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousНу как тут не вспомнить Станиславского...

Упс, cut & paste :

Код: 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.
SQL> select  id,
  2          xmlquery(
  3                   '
  4                    for $c at $i in ora:tokenize($str,", ")
  5                    where $i != 1
  6                    return if ( $token = $c )
  7                             then
  8                               <Reference _Name="{$c}" _Type="IDENTITY" />
  9                             else
 10                               <Reference _Name="{$c}" _Type="AKA" />
 11                   '
 12                   passing ', ' || str as "str",
 13                           :token as "token"
 14                   returning content
 15                  ) new_str
 16    from  test
 17  /

        ID NEW_STR
---------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         1 <Reference _Name="aaa qqq" _Type="AKA"></Reference><Reference _Name="bbb ooo kkk" _Type="AKA"></Reference><Reference _Name="ccc bbb rrr" _Type="IDENTITY"></Reference><Reference _Name="ddd" _Type="AKA"></Reference>


SQL> 
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Интересная задача с преобразованием строки в XML
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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