Запрос Postgres для получения строк, соответствующих критериям xpath - PullRequest
0 голосов
/ 25 мая 2018

Мои 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 ]

0 голосов
/ 25 мая 2018

Если вы используете 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)
0 голосов
/ 25 мая 2018

Как насчет фильтрации с использованием 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 Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...