【问题标题】:Finding repeating substrings in a string在字符串中查找重复的子字符串
【发布时间】:2020-02-24 19:42:58
【问题描述】:

我是 PL/SQL 的新手,我被赋予了这项任务。我有 XML 消息存储在 Receive_XML 表中,字段名称为 XML_DATA。存在发送位置发送拆分序列的问题,这会导致它们在收到返回时出现问题。拆分序列是我们接收序列#1,然后是序列#2,然后再次接收序列#1。

在 Receive_XML 表中搜索以查找任何序列重复多次而不知道序列号的实例的最佳方法是什么。这是我们收到的 XML 记录的示例。

<MESSAGE>
	<HEADER>
		<MESSAGE_TYPE>ProductionSequence</MESSAGE_TYPE>
		<TIMESTAMP>2019-10-29 10:00:01</TIMESTAMP>
	</HEADER>
	<PRODUCTION_SEQUENCE>
		<SEQUENCES>
			<SEQUENCE SEQUENCE_ID="8764          " SEQUENCE_ID_PARENT="">
				<PIECE_GROUPS>
					<PIECE_GROUP>
						<PIECE>
							<PIECE_ID>514236947</PIECE_ID>
						</PIECE>
						<PIECE>
							<PIECE_ID>578645897</PIECE_ID>
						</PIECE>
					</PIECE_GROUP>
				</PIECE_GROUPS>
			</SEQUENCE>
			<SEQUENCE SEQUENCE_ID="6452          " SEQUENCE_ID_PARENT="8764">
				<PIECE_GROUPS>
					<PIECE_GROUP>
						<PIECE>
							<PIECE_ID>514236947</PIECE_ID>
						</PIECE>
						<PIECE>
							<PIECE_ID>578645897</PIECE_ID>
						</PIECE>
					</PIECE_GROUP>
				</PIECE_GROUPS>
			</SEQUENCE>
			<SEQUENCE SEQUENCE_ID="8764          " SEQUENCE_ID_PARENT="6452">
				<PIECE_GROUPS>
					<PIECE_GROUP>
						<PIECE>
							<PIECE_ID>514236947</PIECE_ID>
						</PIECE>
						<PIECE>
							<PIECE_ID>578645897</PIECE_ID>
						</PIECE>
					</PIECE_GROUP>
				</PIECE_GROUPS>
			</SEQUENCE>
		</SEQUENCES>
	</PRODUCTION_SEQUENCE>
</MESSAGE>

感谢您提供的任何帮助。

比尔


我最终发现对我有用的是:

select SEQUENCE_ID, count(SEQUENCE_ID) Counter
from (
  select SEQUENCE_ID
  from   Receive_XML tbl,
       xmltable('/MESSAGE/PRODUCTION_SEQUENCE/SEQUENCES/SEQUENCE' 
                PASSING xmltype(tbl.xml_data)
                COLUMNS SEQUENCE_ID VARCHAR2(30) PATH '@SEQUENCE_ID')
  where tbl.id = 4451
) rs
group by SEQUENCE_ID;

【问题讨论】:

    标签: xml oracle search plsql duplicates


    【解决方案1】:

    请尝试以下PL/SQL。它计算 @SEQUENCE_ID 属性。所以大于 1 的值意味着它是重复的。

    PL/SQL

    CREATE TABLE tbl (ID INT, xml_data XMLType);
    INSERT INTO tbl (ID, xml_data)
    VALUES
    (1, '<MESSAGE>
        <HEADER>
            <MESSAGE_TYPE>ProductionSequence</MESSAGE_TYPE>
            <TIMESTAMP>2019-10-29 10:00:01</TIMESTAMP>
        </HEADER>
        <PRODUCTION_SEQUENCE>
            <SEQUENCES>
                <SEQUENCE SEQUENCE_ID="8764          " SEQUENCE_ID_PARENT="">
                    <PIECE_GROUPS>
                        <PIECE_GROUP>
                            <PIECE>
                                <PIECE_ID>514236947</PIECE_ID>
                            </PIECE>
                            <PIECE>
                                <PIECE_ID>578645897</PIECE_ID>
                            </PIECE>
                        </PIECE_GROUP>
                    </PIECE_GROUPS>
                </SEQUENCE>
                <SEQUENCE SEQUENCE_ID="6452          " SEQUENCE_ID_PARENT="8764">
                    <PIECE_GROUPS>
                        <PIECE_GROUP>
                            <PIECE>
                                <PIECE_ID>514236947</PIECE_ID>
                            </PIECE>
                            <PIECE>
                                <PIECE_ID>578645897</PIECE_ID>
                            </PIECE>
                        </PIECE_GROUP>
                    </PIECE_GROUPS>
                </SEQUENCE>
                <SEQUENCE SEQUENCE_ID="8764          " SEQUENCE_ID_PARENT="6452">
                    <PIECE_GROUPS>
                        <PIECE_GROUP>
                            <PIECE>
                                <PIECE_ID>514236947</PIECE_ID>
                            </PIECE>
                            <PIECE>
                                <PIECE_ID>578645897</PIECE_ID>
                            </PIECE>
                        </PIECE_GROUP>
                    </PIECE_GROUPS>
                </SEQUENCE>
            </SEQUENCES>
        </PRODUCTION_SEQUENCE>
    </MESSAGE>');
    
    select ID, SEQUENCE_ID, count(SEQUENCE_ID) Counter
    from (
      select ID, SEQUENCE_ID
      from   tbl,
           xmltable('/MESSAGE/PRODUCTION_SEQUENCE/SEQUENCES/SEQUENCE' 
                    PASSING tbl.xml_data 
                    COLUMNS SEQUENCE_ID VARCHAR2(30) PATH '@SEQUENCE_ID')
    ) rs
    group by ID, SEQUENCE_ID;
    

    输出

    +----+-------------+---------+
    | ID | SEQUENCE_ID | Counter |
    +----+-------------+---------+
    |  1 |        6452 |       1 |
    |  1 |        8764 |       2 |
    +----+-------------+---------+
    

    【讨论】:

    • 我会看看这个。谢谢!
    • 这正是我所需要的。
    【解决方案2】:

    这个示例 xpath 似乎可以工作:

    with Receive_XML as (
    select xmltype('
    <MESSAGE>
         <HEADER>
    <MESSAGE_TYPE>ProductionSequence</MESSAGE_TYPE>
             <TIMESTAMP>2019-10-29 10:00:01</TIMESTAMP>
         </HEADER>
         <PRODUCTION_SEQUENCE>
             <SEQUENCES>
                 <SEQUENCE SEQUENCE_ID="8764          " SEQUENCE_ID_PARENT="">
                     <PIECE_GROUPS>
                         <PIECE_GROUP>
                             <PIECE>
    <PIECE_ID>514236947</PIECE_ID>
                             </PIECE>
                             <PIECE>
    <PIECE_ID>578645897</PIECE_ID>
                             </PIECE>
                         </PIECE_GROUP>
                     </PIECE_GROUPS>
                 </SEQUENCE>
                 <SEQUENCE SEQUENCE_ID="6452          " 
    SEQUENCE_ID_PARENT="8764">
                     <PIECE_GROUPS>
                         <PIECE_GROUP>
                             <PIECE>
    <PIECE_ID>514236947</PIECE_ID>
                             </PIECE>
                             <PIECE>
    <PIECE_ID>578645897</PIECE_ID>
                             </PIECE>
                         </PIECE_GROUP>
                     </PIECE_GROUPS>
                 </SEQUENCE>
                 <SEQUENCE SEQUENCE_ID="8764          " 
    SEQUENCE_ID_PARENT="6452">
                     <PIECE_GROUPS>
                         <PIECE_GROUP>
                             <PIECE>
    <PIECE_ID>514236947</PIECE_ID>
                             </PIECE>
                             <PIECE>
    <PIECE_ID>578645897</PIECE_ID>
                             </PIECE>
                         </PIECE_GROUP>
                     </PIECE_GROUPS>
                 </SEQUENCE>
             <SEQUENCE SEQUENCE_ID="6452          " SEQUENCE_ID_PARENT="8764">
                     <PIECE_GROUPS>
                         <PIECE_GROUP>
                             <PIECE>
    <PIECE_ID>514236947</PIECE_ID>
                             </PIECE>
                             <PIECE>
    <PIECE_ID>578645897</PIECE_ID>
                             </PIECE>
                         </PIECE_GROUP>
                     </PIECE_GROUPS>
                 </SEQUENCE>
             </SEQUENCES>
         </PRODUCTION_SEQUENCE>
    </MESSAGE>
    ')  XML_DATA from dual )
    select
    xt.dup
    FROM   Receive_XML xt,
           XMLTABLE('//SEQUENCE'
             PASSING xt.xml_data
             COLUMNS 
              dup VARCHAR2(20)  PATH '@SEQUENCE_ID[.= ../preceding-sibling::SEQUENCE/@SEQUENCE_ID]'
            ) xt
    where dup is not null        
    

    【讨论】:

    • 这将使我走上我需要的道路。我不知道阅读 XML 如此简单。我试图将它视为一个字符串(因此是标题)。非常感谢您的帮助!
    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多