Seminární skupina 5+6 PB138

Dotazovací jazyk XQuery (16. 4.)

FLWOR

  • FOR, RETURN
  • for $p in doc('test')/people/person return $p

    for $p in doc('test')/people/person/name return $p

  • zobrazení části dokumentu, formát výstupu

for $p in doc('test')/people/person return $p/name

for $p in doc('test')/people/person[@id='2'] return $p/name/text()

for $p in doc('test')/people/person[@id='2'] return <jmeno>{$p/name/text()}</jmeno>

  • LET, přiřazení

 

let $persons := doc('test')/people/person
for $p in $persons return $p/name

 

let $id := '2'
let $persons := doc('test')/people/person
for $p in $persons[@id=$id] return $p/name 

  • WHERE, podmínky

for $p in doc('test')/people/person where contains($p/name, 'Pav') return $p/name

for $p in doc('test')/people/person where count($p/cars/car)>0 return <zaznam><jmeno>{$p/name/text()}</jmeno><prijmeni>{$p/surname/text()}</prijmeni><pocet>{count($p/cars/car)}</pocet></zaznam>

for $p in doc('test')/people/person let $c := $p/cars/car where $c/year < 2000 return <zaznam><prijmeni>{$p/surname/text()}</prijmeni>{$c/type}</zaznam>

  • ORDER, řazení

for $p in doc('test')/people/person order by $p/surname descending return $p/surname

 

  • ​pozor, zrada - vícenasobné elementy, př. note se opakuje v jednom záznamu víckrát. Dotaz, který vás jako první napadne, nebude fungovat.
  • for $p in doc('test')/people/person where contains($p/note, 'pozn') return $p/note
  • správné řešení je zeptat se "hele, a nemáte tam note, který by splňoval tuhle podmínku?"
  •  for $p in doc('test')/people/person where some $n in $p/note satisfies contains(upper-case($n), upper-case('pozn')) return <r><prijmeni>{$p/surname/text()}</prijmeni>{$p/note}</r>
     
  • Úloha: Napište dotaz, který vypíše SPZ aut Škoda, která jsou starší než 1998.
  • Úloha: Vypište id a plat lidí, kteří nemají auto.
  • Úloha: Vypište součet platů.
Následující