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

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
29.09.2016, 02:52
    #39317395
Sergey_2583
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задача с преобразованием строки в XML
немного уточню, между запятыми может быть несколько слов, немного уточнённый мой пример:

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
29.09.2016, 03:11
    #39317397
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задача с преобразованием строки в XML
Самый обыкновенный 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
29.09.2016, 07:02
    #39317428
Sergey_2583
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задача с преобразованием строки в XML
SY, не совсем, нет сравнения с входной строкой, для одного тега _type должен принять другое значение
...
Рейтинг: 0 / 0
29.09.2016, 12:40
    #39317733
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задача с преобразованием строки в XML
Код: 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
29.09.2016, 12:46
    #39317741
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задача с преобразованием строки в XML
и для красоты :)

Код: 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
29.09.2016, 13:04
    #39317753
tokenize+flwor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задача с преобразованием строки в XML
Dmitry.,

громоздко
...
Рейтинг: 0 / 0
29.09.2016, 15:55
    #39317970
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задача с преобразованием строки в XML
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
29.09.2016, 16:26
    #39318003
Sergey_2583
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задача с преобразованием строки в XML
Спасибо за помощь
...
Рейтинг: 0 / 0
29.09.2016, 17:00
    #39318022
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задача с преобразованием строки в XML
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
29.09.2016, 19:55
    #39318128
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задача с преобразованием строки в XML
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
29.09.2016, 20:06
    #39318135
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная задача с преобразованием строки в XML
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Интересная задача с преобразованием строки в XML / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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