Oracle中的XMLQuery

时间:2015-04-10 13:09:44

标签: sql oracle xquery

我想过滤以下数据库中的一些元素:

`CREATE TABLE Club
( name         VARCHAR2(30),
  championship XMLTYPE);`

XML部分如下所示:

`INSERT INTO Club VALUES ('FC Arsenal',
'<championship>
    <champion no="13">
        <league>PremierLeague</league>
        <year>2004</<year>
    </champion>
    <champion no="11">
        <league>FA_Cup</league>
        <year>2014</year>
    </champion>
</championship>'
);`

我想过滤俱乐部的名称和年份,但前提是球队赢得了超级联赛。

我的解决方案如下:

`SELECT Name, XMLQuery(
  'for $i in /championship
    where $i/champion/league = "PremierLeague"
    return $i/champion/year
    PASSING Club RETURNING content) As year
FROM Club;`

我不确定如何组合查询,因此名称取决于xmlquery。现在,即使没有赢得英超联赛,我也可以获得所有俱乐部的名字。另一个问题是我得到了名字,但年份是(null)。

有什么问题?

感谢&#39; S

2 个答案:

答案 0 :(得分:1)

将它作为XMLExists添加到where子句中:

SELECT Name, XMLQuery(
  'for $i in /championship
    where $i/champion/league = "PremierLeague"
    return $i/champion/year'
    PASSING championship RETURNING content) As year
FROM SPFEV.Club where XMLExists(
  '$i/championship/champion/@league[.="PremierLeague"]'
    PASSING championship as "i");

这在语法上是正确的,我知道哪个部分是正确的,我对你所做的部分不太确定。

答案 1 :(得分:1)

由于团队可能赢得超过一年的时间,因此使用XMLTable方法可能会更好:

SELECT c.name, x.year
FROM club c
CROSS JOIN XMLTable('/championship/champion'
  PASSING c.championship
  COLUMNS league VARCHAR2(20) PATH 'league',
    year NUMBER PATH 'year') x
WHERE x.league = 'PremierLeague';

NAME                                 YEAR
------------------------------ ----------
FC Arsenal                           2004

这可以从XML获得年份和联赛,然后过滤联盟名称。