ORACLE SQL выбирает значения из XML - PullRequest
0 голосов
/ 21 мая 2018

Как выбрать значения из XML в ORACLE SQL?

Допустим, у меня есть два XML в таблице "items":

данные первой строки и столбца "intreevalue"

<change xmlns="http://do.it.com/ch/PLP">
  <header>
    <op>XDD</op>
  </header>
  <id>10565</id>
</change>

и данные второй строки и столбца "intreevalue"

<deactivate xmlns="http://mrlo.com/nnu/XCBouIK">
  <header>
    <op>XDG</id>
  </header>
  <id>67544</id>
</deactivate>

Я знаю, что значение EXTRACTVALUE ограничено.Мне нужны значения "op" и "id" в одном select.Я предполагаю, что если бы не было пространства имен вроде 'xmlns = "http://do.it.com/ch/PLP"', это было бы легко. Но могу ли я выбрать такие данные (пример - я знаю, что это не может работать, просто пытаясь сказать, что я имею в виду)?

select "/*/header/op" op, "/*/id" id from .....

Спасибо

1 Ответ

0 голосов
/ 21 мая 2018

Я вижу два варианта:

  1. Используйте REGEXP_REPLACE() для удаления всех атрибутов xmlns из всех тегов.

    SELECT EXTRACT(XMLTYPE(REGEXP_REPLACE(items.intreevalue,
                                          '(<[^>]+[[:space:]]+)xmlns(?::[^[:space:]=]+)?[:space:]*=[:space:]*"[^"]*"',
                                          '\1')),
                   '/*/header/op/text()')
           .GETSTRINGVAL() op,
           EXTRACT(XMLTYPE(REGEXP_REPLACE(items.intreevalue,
                                          '(<[^>]+[[:space:]]+)xmlns(?::[^[:space:]=]+)?[:space:]*=[:space:]*"[^"]*"',
                                          '\1')),
                   '/*/id/text()')
           .GETNUMBERVAL() id
           FROM items;
    

    Но это может быть проблемойесли вам действительно нужно обрабатывать некоторые элементы из разных пространств имен по-разному.Может быть, тогда вы сможете настроить регулярное выражение, чтобы удалить только «проблемные» атрибуты пространства имен, но оставить другие.

  2. Используйте большое значение CASE ... END, чтобы проверить каждое возможное пространство имен и взять первое, которое выполучить (не NULL) результат для.

    SELECT CASE
             WHEN EXTRACT(items.intreevalue,
                          '/*/header/op/text()',
                          'xmlns="http://do.it.com/ch/PLP"')
                  .GETSTRINGVAL() IS NOT NULL
               THEN EXTRACT(items.intreevalue,
                            '/*/header/op/text()',
                            'xmlns="http://do.it.com/ch/PLP"')
                    .GETSTRINGVAL()
             WHEN EXTRACT(items.intreevalue,
                          '/*/header/op/text()',
                          'xmlns="http://mrlo.com/nnu/XCBouIK"')
                  .GETSTRINGVAL() IS NOT NULL
               THEN EXTRACT(items.intreevalue,
                            '/*/header/op/text()',
                            'xmlns="http://mrlo.com/nnu/XCBouIK"')
                    .GETSTRINGVAL()
           END op,
           CASE
             WHEN EXTRACT(items.intreevalue,
                          '/*/id/text()',
                          'xmlns="http://do.it.com/ch/PLP"')
                  .GETNUMBERVAL() IS NOT NULL
               THEN EXTRACT(items.intreevalue,
                            '/*/id/text()',
                            'xmlns="http://do.it.com/ch/PLP"')
                    .GETNUMBERVAL()
             WHEN EXTRACT(items.intreevalue,
                          '/*/id/text()',
                          'xmlns="http://mrlo.com/nnu/XCBouIK"')
                  .GETNUMBERVAL() IS NOT NULL
               THEN EXTRACT(items.intreevalue,
                            '/*/id/text()',
                            'xmlns="http://mrlo.com/nnu/XCBouIK"')
                    .GETNUMBERVAL()
           END id
           FROM items;
    

    Если в этом случае отсутствует пространство имен, вы все равно получите NULL s для соответствующего XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...