如何在SQL查询中选择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

我有一个表,其中CLOB列存储XML。XML的结构不可读。我想在几个标记之间获取值,比如
;示例如下所示

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