如何在SQL查询中选择XML标记之间的值
我有一个表,其中CLOB列存储XML。XML的结构不可读。我想在几个标记之间获取值,比如如何在SQL查询中选择XML标记之间的值,sql,regex,xml,oracle,regexp-replace,Sql,Regex,Xml,Oracle,Regexp Replace,我有一个表,其中CLOB列存储XML。XML的结构不可读。我想在几个标记之间获取值,比如;示例如下所示 XML: 实际XML: <?xml version="1.0" encoding="US-ASCII"?> <GML:GMMessage xmlns:GML="GML" xmlns:GMLType="GML.Type" xsi:schemaLocation=&quo
;示例如下所示
XML:
实际XML:
<?xml version="1.0" encoding="US-ASCII"?>
<GML:GMMessage
xmlns:GML="GML"
xmlns:GMLType="GML.Type"
xsi:schemaLocation="GML ../schema/gml..xsd" SchemaVersion="9.8">
<BusinessHdr>
<busHdr:BusObjectType>ABC</busHdr:BusObjectType>
<busHdr:BusObjectOwner>HDHDH</busHdr:BusObjectOwner>
<busHdr:BusObjectId>DJHDAHDAJHDA</busHdr:BusObjectId>
<busHdr:BusObjectVersion>1</busHdr:BusObjectVersion>
</BusinessHdr>
<Transaction>
<GenericEvent>NEW</GenericEvent>
<Group>
<GroupId>3424234</GroupId>
<Reason>MANUAL</Reason>
</Group>
< xsi:type="mm:MMIam">
<Id>
<Domain>ssdsgdsg</Domain>
<DomainId>123456ACC</DomainId>
<Version>1</Version>
</Id>
<Date>2021-02-01</Date>
</Transaction>
</GML:GMMessage>
基础知识
HDH
乔达赫达
1.
新的
3424234
手册
ssdsgdsg
123456cc
1.
2021-02-01
很高兴看到你的思维方式
我建议您使用这个工具(如果您没有类似的工具)来帮助您使用正则表达式,这对我很有帮助
您的SQL看起来是正确的(对多行使用“m”和“n”标志),但不确定您的XML是否键入错误,因为您的正则表达式字符串对您粘贴的XML不起作用,但如果它是XML,我确实能起作用
SQL的当前输出是什么?您可能需要使用$1
代替\1
我还建议
从选项卡中选择REGEXP_REPLACE(列,^.*([0-9A-z]+).*$','1',1,0,'mn')列1;
不要使用正则表达式解析XML;使用适当的XML解析器
但是,您拥有的XML格式不正确,因为它缺少根元素,并且在所有结束标记中缺少/
;因此,首先需要修复XML并给它一个根元素,然后可以使用XML解析器对其进行解析
选择x*
来自表\u name t
交叉应用XMLTABLE(
“//根”
传递XMLTYPE(“”| | t.data | |“”)
柱
域VARCHAR2(10)路径“./ID/domain”,
domainid VARCHAR2(10)路径'/ID/domainid',
gp VARCHAR2(50)路径“./GROUP/gp”,
rsn VARCHAR2(50)路径“./GROUP/rsn”
)x
其中,对于样本数据:
创建表格名称(数据)为
选择'
IND
112AC
亚洲
好
"从双
产出:
哪些产出:
然后,您只需要添加您正在使用的名称空间,并更新到新(区分大小写)位置的路径:
选择x*
来自表\u name t
交叉应用XMLTABLE(
XMLNAMESPACES('GML'作为“GML”),
“//GML:GMMessage/Transaction”
传递XMLTYPE(t.data)
柱
域VARCHAR2(10)路径“./Id/domain”,
domainid VARCHAR2(10)路径'/Id/domainid',
版本号(3,0)路径“./Id/version”,
groupid VARCHAR2(50)路径“./Group/groupid”,
原因VARCHAR2(50)路径“./Group/reason”,
dt日期路径'/DATE'
)x
产出:
域|域ID |版本|组ID |原因| DT
:------- | :-------- | ------: | :------ | :----- | :--------
ssdsgdsg | 123456AC | 1 | 3424234 |手册| 01-FEB-21
DBFIDLE这里我只得到数字部分,但缺少字母。你能检查一下吗?获取
112
但需要112AC
感谢您的回答,但是这不起作用,因为我有Oracle 11g。它的给出ORA-00905:缺少关键字
。您能建议吗?@vnsingh在Oracle 11g上,使用交叉连接
而不是交叉应用
。我不确定我需要在这里放置什么路径,我的XML看起来像您能更新答案吗?谢谢@MTO。因为数据库出了点问题,所以没跟我说话但这看起来很有希望,
SELECT REGEXP_REPLACE(COL,'^.*<DOMAINID>(.*)</DOMAINID>.*$','\1',1,0,'mn') col1 FROM tab;
112AC
<?xml version="1.0" encoding="US-ASCII"?>
<GML:GMMessage
xmlns:GML="GML"
xmlns:GMLType="GML.Type"
xsi:schemaLocation="GML ../schema/gml..xsd" SchemaVersion="9.8">
<BusinessHdr>
<busHdr:BusObjectType>ABC</busHdr:BusObjectType>
<busHdr:BusObjectOwner>HDHDH</busHdr:BusObjectOwner>
<busHdr:BusObjectId>DJHDAHDAJHDA</busHdr:BusObjectId>
<busHdr:BusObjectVersion>1</busHdr:BusObjectVersion>
</BusinessHdr>
<Transaction>
<GenericEvent>NEW</GenericEvent>
<Group>
<GroupId>3424234</GroupId>
<Reason>MANUAL</Reason>
</Group>
< xsi:type="mm:MMIam">
<Id>
<Domain>ssdsgdsg</Domain>
<DomainId>123456ACC</DomainId>
<Version>1</Version>
</Id>
<Date>2021-02-01</Date>
</Transaction>
</GML:GMMessage>
SELECT REGEXP_REPLACE(COL,'^.*<DOMAINID>([0-9A-z]+)<\/DOMAINID>.*$','$1',1,0,'mn') col1 FROM tab;
DOMAIN | DOMAINID | GP | RSN
:----- | :------- | :--- | :---
IND | 112AC | ASIA | GOOD
| DOMAINID |
| :------- |
| 112AC |
DOMAIN | DOMAINID | VERSION | GROUPID | REASON | DT
:------- | :-------- | ------: | :------ | :----- | :--------
ssdsgdsg | 123456ACC | 1 | 3424234 | MANUAL | 01-FEB-21