【问题标题】:Oracle Regex Replace on String QueryOracle 正则表达式替换字符串查询
【发布时间】:2016-09-03 20:29:48
【问题描述】:

从保存在我的表的 CLOB 列中的 xml 中获取子 xml 的查询如下:

select REGEXP_REPLACE(xmltype(t.prov_request).extract('//SOAP_Domain_Msg/Body').getStringVal(),'<Body>|</Body>','') xml 
from tbl_prov_comptel

上述查询返回的字符串中有"SO1_USERNAME" value="xxx"。 我想要实现的是形成一个合并查询并在上面表达式的开头附加一些内容。

"SO1_USERNAME" value="qwexxx"

【问题讨论】:

  • 您能否提供一些示例数据和数据的预期输出
  • /* 附加到XPath 中,您可以像这样摆脱REGEXP_REPLACExmltype(t.prov_request).extract('//SOAP_Domain_Msg/Body/*').getStringVal()
  • @MT0 完美的先生。那行得通,但这只是其中的一部分。我想在同一个查询中对返回的字符串应用替换函数。即字符串包含 "SO1_USERNAME" value="xxx" ,我想在字符串中添加几个字符,例如 "SO1_USERNAME" value="123xxx" 。我一直无法这样做。
  • 正如@Matt 所说 - 请提供一些示例数据和您的预期输出。使用 XPath 可能有一种简单的方法(没有正则表达式 - 因为 XHTML is not a regular language 所以使用正则表达式可靠地解析它并不总是简单的)。
  • 这是保存在clob中的xml。 &lt;SOAP_Domain_Msg&gt; &lt;/Header&gt; &lt;Body&gt; &lt;NS4:ModifyRequest xmlns:NS4="http://soa.comptel.com/2011/02/instantlink"&gt; &lt;NS4:RequestParameters&gt; &lt;NS4:Parameter name="SO1_USERNAME" value="222671150"/&gt; &lt;/NS4:RequestParameters&gt; &lt;/NS4:ModifyRequest&gt; &lt;/Body&gt; &lt;/SOAP_Domain_Msg&gt; 我打算编写一个从 &lt;NS4:ModifyRequest&gt; 开始返回子 xml 的查询。此外,我想应用所选 xml 的用户名属性附加一些数字,即&lt;NS4:Parameter name="SO1_USERNAME" value="CBA222671150"/&gt;@MT0 @Matt

标签: sql regex database oracle replace


【解决方案1】:

Oracle 设置

CREATE TABLE tbl_prov_comptl ( prov_request CLOB );

INSERT INTO tbl_prov_comptl VALUES (
  '<SOAP_Domain_Msg><Body><NS4:ModifyRequest xmlns:NS4="http://soa.comptel.com/2011/02/instantlink"><NS4:RequestParameters> <NS4:Parameter name="SO1_USERNAME" value="222671150"/></NS4:RequestParameters> </NS4:ModifyRequest></Body></SOAP_Domain_Msg>'
);

查询

SELECT EXTRACTVALUE(
         xml,
         '//NS4:ModifyRequest/NS4:RequestParameters/NS4:Parameter[name="SO1_USERNAME"]/@value',
        'xmlns:NS4="http://soa.comptel.com/2011/02/instantlink"'
       ) AS SO1_USERNAME,
       x.xml.getStringVal() AS xml
FROM   (
  SELECT XMLType( prov_request ).extract( '//SOAP_Domain_Msg/Body/*' ) AS xml
  FROM   tbl_prov_comptl
) x;

输出

SO1_USERNAME XML
------------ ------------------------------------------------------------------------------
222671150    <NS4:ModifyRequest xmlns:NS4="http://soa.comptel.com/2011/02/instantlink"><NS4
             :RequestParameters> <NS4:Parameter name="SO1_USERNAME" value="222671150"/></NS
             4:RequestParameters> </NS4:ModifyRequest>

【讨论】:

  • 感谢您的帮助,但有一个问题。我希望返回的“XML”也附加用户名。在这种情况下"SO1_USERNAME" value="ABC222671150"请帮忙。
  • 只需使用字符串连接即可:xml || '"SO1_USERNAME" value="' || SO1_USERNAME || '"'
  • 当我执行您提供的查询时,SO1_USERNAME 中的内容为空。
猜你喜欢
  • 2019-04-17
  • 2018-07-13
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
相关资源
最近更新 更多