2016-04-05 3 views
0

У меня есть эта таблицаOracle SQL и XML Выбор вещей в качестве 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 XMLTYPE FROM Test_T WHERE ('/breakfast_menu/food[contains(name, 'Belgian')]'); 

Может ли кто-нибудь указать мне в правильном направлении?

ответ

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%'; 

В зависимости от различных факторов, один из них может быть более эффективным. Вы можете запустить диагностику и выяснить, какая фильтрация лучше всего подходит для ваших данных.

+0

Эй, человек, который помогает много, спасибо! –

+0

@ ruudvan- На самом деле, когда я использую первый, он просто дает мне пустой стол. –