我想过滤以下数据库中的一些元素:
`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
答案 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获得年份和联赛,然后过滤联盟名称。