Oracle SQL和XML选择XMLType类型

时间:2016-04-05 20:59:51

标签: sql xml oracle xquery xmltype

我有这张桌子

 CREATE TABLE Test_T (
  COL_1 VARCHAR(30),
  COL_2 XMLTYPE
);

内置

INSERT INTO Test_T VALUES ('one', XMLType('<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
 <food>
  <name>Belgian Waffles</name>
  <price>$5.95</price>
  <description>Two of our famous Belgian Waffles with plenty of real maple syrup</description>
  <calories>650</calories>
 </food>
 <food>
  <name>Strawberry Belgian Waffles</name>
  <price>$7.95</price>
  <description>Light Belgian waffles covered with strawberries and whipped cream</description>
  <calories>900</calories>
 </food>
 <food>
  <name>Berry-Berry Belgian Waffles</name>
  <price>$8.95</price>
  <description>Light Belgian waffles covered with an assortment of fresh berries and whipped cream</description>
  <calories>900</calories>
 </food>
  <food>
  <name>French Toast</name>
  <price>$4.50</price>
  <description>Thick slices made from our homemade sourdough bread</description>
  <calories>600</calories>
 </food>
 <food>
  <name>Homestyle Breakfast</name>
  <price>$6.95</price>
   <description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns</description>
  <calories>950</calories>
 </food>
</breakfast_menu>
'));

我想从此表中选择Name And description包含name

Belgian

我从这个select语句开始,但它似乎没有工作

SELECT XMLTYPE FROM Test_T WHERE ('/breakfast_menu/food[contains(name, 'Belgian')]');

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

您正在寻找XMLTABLE

以下是SQL语句对XML的看法 -

SELECT name, description
  FROM test_t,
       XMLTABLE (
          '/breakfast_menu/food[contains(name,"Belgian")]'
          PASSING test_t.col_2
          COLUMNS name VARCHAR2 (100) PATH 'name',
                  description VARCHAR2 (100) PATH 'description');

另一种写同样东西的方法是 -

SELECT name, description
  FROM test_t,
       XMLTABLE (
          '/breakfast_menu/food'
          PASSING test_t.col_2
          COLUMNS name VARCHAR2 (100) PATH 'name',
                  description VARCHAR2 (100) PATH 'description')
 WHERE name LIKE '%Belgian%';

根据各种因素,其中一项可能更有效。您可以运行诊断并确定哪种过滤最适合您的数据。