xquery выбрать по атрибутам - PullRequest
       10

xquery выбрать по атрибутам

0 голосов
/ 06 ноября 2018

Существует таблица A со столбцом даты с именем logdate и столбцом xml с именем tag, который имеет значение xml, например:

<process id="1540193803286" startTime="2018-10-24 10:01:26.467" >
<user>
<userId>2020</userId>   
</user> 
<executionCclass>
<executionNode classid="1" className="testclass_record1" methodName="testmethod" timeSpent="0" />
<executionNode classid="1-1" className="testclass2_record1" methodName="testmethod2" timeSpent="0" />

Я хочу выбрать записи с определенным logdate, который имеет classid="1" в их XML.

Пример: TableName: TestTable Столбцы: logdate (десятичное число), xml (Xml)

образцы записей:

1) logdate = 20181101, xml = [что-то вроде того, что я написал выше]

2) logdate = 20181101, xml = [что-то вроде того, что я написал выше]

3) logdate = 20181102, xml = [что-то вроде того, что я написал выше]

4) logdate = 20181103, xml = [что-то вроде того, что я написал выше]

5) logdate = 20181103, xml = [что-то вроде того, что я написал выше]

Результат, который я хочу:

className, где Logdate> 20181101 и classid = 1

например:

1) 20181102, testclass_record3

2) 20181103, testclass_record4

3) 20181103, testclass_record5

Как я могу использовать db2 xquery для этого выбора?

1 Ответ

0 голосов
/ 06 ноября 2018

Попробуйте это:

declare global temporary table session.test_xml (logdate dec(8), tag xml) with replace on commit preserve rows not logged;

insert into session.test_xml values 
  (20181102, xmlparse (document '
<process id="1540193803286" startTime="2018-10-24 10:01:26.467" >
  <user>
    <userId>2020</userId>   
  </user> 
  <executionCclass>
    <executionNode classid="1" className="testclass_record1" methodName="testmethod" timeSpent="0" />
    <executionNode classid="1-1" className="testclass2_record1" methodName="testmethod2" timeSpent="0" />
  </executionCclass>
</process>
'
))
, (20181102, xmlparse (document '
<process id="1540193803286" startTime="2018-10-24 10:01:26.467" >
  <user>
    <userId>2020</userId>   
  </user> 
  <executionCclass>
    <executionNode classid="2" className="testclass_record1" methodName="testmethod" timeSpent="0" />
    <executionNode classid="1-1" className="testclass2_record1" methodName="testmethod2" timeSpent="0" />
  </executionCclass>
</process>
'
))
;

select a.logdate, t.classname
from session.test_xml a
, xmltable ('$doc/process/executionCclass/executionNode[@classid="1"]' passing a.tag as "doc" columns
    classname varchar(128) path '@className'
) t 
where xmlexists('$doc/process/executionCclass/executionNode[@classid="1"]' passing a.tag as "doc")
and Logdate>20181101;
...