PostgreSQL xpath - по условию даты - PullRequest
0 голосов
/ 02 марта 2020

У меня xml хранится в postgres дБ

<data>
    <contract>
        <details>
            <code>BAC</code>
            <type>SU</type>
            <amount>879</amount>
        </details>
        <start_date>15062020</start_date>
    </contract>
    <contract>
        <details>
            <code>BAC</code>
            <type>SU</type>
            <amount>879</amount>
        </details>
        <start_date>15062019</start_date>
    </contract>
</data>

Мне нужно отфильтровать контракты, где код равен BA C, а тип - SU (да, оба контракта равны до этого состояния). Но мне также нужно отфильтровать дату начала, где start_date меньше текущей даты, поэтому первый контракт должен быть отфильтрован. По какой-то причине это не так.

Вот мой код:

select
 id,

  unnest(
    xpath(
      'sum(/data/details[code=="BAC" and type="SU"] and start_date >='
        || to_char(current_date, 'DDMMYYYY') 
        || ']/amount/text())', 
      xmlparse(document xml)
    )
  )::text::numeric as current_contracts


from my_db

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

если вы используете PG 10+, вы можете использовать XMLTABLE, и после этого манипулировать результатом как таблицей, это будет проще

with sub as (
SELECT tabla_xml.*

FROM (VALUES 
 ('<data>
    <contract>
        <details>
            <code>BAC</code>
            <type>SU</type>
            <amount>879</amount>
        </details>
        <start_date>15062020</start_date>
    </contract>
    <contract>
        <details>
            <code>BAC</code>
            <type>SU</type>
            <amount>879</amount>
        </details>
        <start_date>15062019</start_date>
    </contract>
</data>'::xml) )  AS t (data),
XMLTABLE ('//data/contract/details'
PASSING t.data
COLUMNS code text PATH 'code',
type text PATH 'type',
amount real PATH 'amount',
 start_date text path '../start_date' ) tabla_xml)

 select * from sub where code='BAC' and type='SU'

вы получите:

BAC SU  879 15062020
BAC SU  879 15062019
0 голосов
/ 02 марта 2020

Кажется, ваш XPath выключен. Пожалуйста, попробуйте следующее в качестве отправной точки.

XPath

/data/contract/details[code="BAC" and type="SU"]/amount/text()

XPath с датой

/ данные / контракт [start_date ge "15062020"] / details [code = "BA C" и type = "SU"] / amount / text ()

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