在db2(sql/xml)中使用xmlquery从xml中选择元素

niwlg2el  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(463)

我在db2中创建了如下表:

  1. create table xml_file(data xml not null)

这就是xml的确切结构:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <student id="20140021">
  3. <name>Tom</name>
  4. <surname>Johnson</surname>
  5. <birth_date>"05/11/1995"</birth_date>
  6. <birth_place>"Miami"</birth_place>
  7. <points>9.45</points>
  8. </student>

我要为所有名为本、出生地为芝加哥的学生选择id、姓名、姓氏和分数。
我写了这样的东西:

  1. select xmlquery('$DATA/student/data(@id)') as ID,
  2. xmlquery('$DATA/student/name/text()') as NAME,
  3. xmlquery('$DATA/student/surname/text()') as SURNAME,
  4. xmlquery('$DATA/student/points/text()') as POINTS
  5. from xml_file
  6. where xmlexists('$DATA/student[birth_place = "Chicago"]')
  7. and xmlexists('$DATA/student[name = "Ben"]');

我得到的只是一条消息:“获取0条记录,显示0条记录”(这是在ibmdatastudio中)。
有人能告诉我我做错了什么吗?

rkue9o1l

rkue9o1l1#

试着换两个 where xmlexists s与1(这与问题中的示例xml一起使用,而不是与代码一起使用):

  1. where xmlexists('$DATA//student[birth_place/text()['Miami']][name/text()["Tom"]]');

或者,需要两个:

  1. where xmlexists('$DATA/student[birth_place/text()['Miami']]')
  2. and xmlexists('$DATA/student[name/text()["Tom"]]');

看看这两种方法是否有效。

ybzsozfc

ybzsozfc2#

birth place元素包含双引号,这会导致xpath计算错误。为避免此情况,请更换 where xmlexists('$DATA/student[birth_place = "Chicago"]') 使用以下xpath表达式之一:
xpath 1.0友好型:

  1. where xmlexists('$DATA/student/birth_place[substring(.,2,string-length(/student/birth_place)-2)="Chicago"]')

xpath 2.0友好:

  1. where xmlexists('$DATA/student/birth_place[translate(.,codepoints-to-string(34),"")="Chicago"]')

用于测试示例数据的xpath:

  1. /student/birth_place[substring(.,2,string-length(/student/birth_place)-2)="Miami"]
  2. /student/birth_place[translate(.,codepoints-to-string(34),"")="Miami"]
ssm49v7z

ssm49v7z3#

试试这个:

  1. /*
  2. WITH xml_file (data) AS
  3. (
  4. VALUES
  5. XMLPARSE
  6. (DOCUMENT '<?xml version="1.0" encoding="UTF-8" ?>
  7. <student id="20140021">
  8. <name>Tom</name>
  9. <surname>Johnson</surname>
  10. <birth_date>"05/11/1995"</birth_date>
  11. <birth_place>"Miami"</birth_place>
  12. <points>9.45</points>
  13. </student>'
  14. )
  15. )
  16. * /
  17. SELECT X.*
  18. FROM
  19. xml_file V
  20. , XMLTABLE
  21. ('$doc/student' PASSING V.data AS "doc"
  22. COLUMNS
  23. ID INT PATH '@id'
  24. , NAME VARCHAR(20) PATH 'name'
  25. , SURNAME VARCHAR(20) PATH 'surname'
  26. , POINTS DEC(5, 2) PATH 'points'
  27. ) X
  28. WHERE XMLEXISTS('$doc/student[birth_place = """Miami""" and name = "Tom"]' PASSING V.data AS "doc");
展开查看全部

相关问题