1

我有一个 oracle 表,其中有一列存储 XML。XML 具有以下语法:

<?xml version="1.0"?>
<MessageData>
  <TextblockParameters>
    <TextblockParameter>
      <tagName>BUSINESSPROCESSID</tagName>
      <value>RETAIL</value>
    </TextblockParameter>
    <TextblockParameter>
      <tagName>SEGMENT</tagName>
      <value>RESIDENTIAL</value>
    </TextblockParameter>
    <TextblockParameter>
      <tagName>TRANSACTIONTYPE</tagName>
      <value>PURCHASE</value>
    </TextblockParameter>
    <TextblockParameter>
      <tagName>LANGUAGE</tagName>
      <value>EST</value>
    </TextblockParameter>
  </TextblockParameters>
</MessageData>

现在我需要<value></Value>从所有 4 个地方获取信息。请帮助解决这个问题,不知道Extractvalue是否是最佳解决方案

4

2 回答 2

4

您可以XMLTABLE为此使用函数(参见示例):

SELECT t.foo, xt.*
FROM t, XMLTABLE('//TextblockParameter'
    PASSING t.xmlcol
    COLUMNS
        tagName VARCHAR2(100) PATH './tagName',
        value VARCHAR2(100) PATH './value'
) xt;

db<>fiddle 上的演示

于 2019-02-13T08:48:53.460 回答
-1

您可以使用

select extract(col1, '//value') from t;
create table t (col1 xmltype);
insert into t values ('
<MessageData>
  <TextblockParameters>
    <TextblockParameter>
      <tagName>BUSINESSPROCESSID</tagName>
      <value>RETAIL</value>
    </TextblockParameter>
    <TextblockParameter>
      <tagName>SEGMENT</tagName>
      <value>RESIDENTIAL</value>
    </TextblockParameter>
    <TextblockParameter>
      <tagName>TRANSACTIONTYPE</tagName>
      <value>PURCHASE</value>
    </TextblockParameter>
    <TextblockParameter>
      <tagName>LANGUAGE</tagName>
      <value>EST</value>
    </TextblockParameter>
  </TextblockParameters>
</MessageData>');
1 行受影响
select extract(col1, '//value') from t;
| EXTRACT(COL1,'//值') |
| :------------------------------------------------ -------------------------------------------------- ---- |
| <value>零售</value><br><value>住宅</value><br><value>购买</value><br><value>EST</value><br> |

db<>在这里摆弄

于 2019-02-13T08:23:48.220 回答