bugfix> sql > 投稿

私のxmldataは、

<Transaction >
   <UUID>2017-03-17T08:00:00-086F0ADD43</UUID>
   <SequenceNumber Type="a">1</SequenceNumber>
   <SequenceNumber Type="b">1</SequenceNumber>
</Transaction>
<Transaction >
   <UUID>2017-03-17T08:00:00-086F0ADD43</UUID>
   <SequenceNumber Type="a">2</SequenceNumber>
   <SequenceNumber Type="b">2</SequenceNumber>
</Transaction>

私の現在のクエリは:

select xmldata, cast ((xpath('/Transaction/SequenceNumber[@Type="b" and text()="1"]/text()', xmldata)) AS TEXT) from tbltransaction

これにより、すべての行、

   xmldata    | xpath
---------------+-----
 <Transaction> | {1}
 <Transaction> | {}

しかし、以下のような正確な値を持つ結果セットが必要です。

    xmldata    | xpath
---------------+-----
 <Transaction> | {1}

これを取得するために上記のクエリを変更する方法は?

回答 2 件
  • WHERE を使用して除外する方法は :

    select s.r, xmldata 
    from tbltransaction t
    JOIN LATERAL (
        SELECT (xpath('/Transaction/SequenceNumber[@Type="b" and text()="1"]/text()',
                t.xmldata)::TEXT) AS r
         )s ON TRUE
    WHERE s.r != '{}';
    
    

    DBFiddleデモ

  • PostgreSQL 10を使用している場合、XMLTABLEを使用できます。

    WITH data (xmldata) AS (VALUES('<Transaction >
       <UUID>2017-03-17T08:00:00-086F0ADD43</UUID>
       <SequenceNumber Type="a">1</SequenceNumber>
       <SequenceNumber Type="b">1</SequenceNumber>
    </Transaction>'::xml),('
    <Transaction >
       <UUID>2017-03-17T08:00:00-086F0ADD43</UUID>
       <SequenceNumber Type="a">2</SequenceNumber>
       <SequenceNumber Type="b">2</SequenceNumber>
    </Transaction>'::xml))
    SELECT *
      FROM data
         , XMLTABLE('/Transaction/SequenceNumber[@Type="b" and text()="1"]/text()'
                    PASSING xmldata
                    COLUMNS xpath XML PATH '.'
                   ) t;
    
    

    あなたにあげる:

                       xmldata                     | xpath
    ------------------------------------------------+-------
     <Transaction >                                +| 1
        <UUID>2017-03-17T08:00:00-086F0ADD43</UUID>+|
        <SequenceNumber Type="a">1</SequenceNumber>+|
        <SequenceNumber Type="b">1</SequenceNumber>+|
     </Transaction>                                 |
    (1 row)
    
    

あなたの答え