Was ist XQuery? / Sortierung einer Sequenz

Sortierung einer Sequenz

Sortierung einer Sequenz

➪ Mit "order by" ist auch die Sortierung einer Sequenz problemlos möglich.


<erg>
{
  for $x in ((1 to 10)[. mod 3 = 0], 'Holzflos')
  order by $x descending
  where $x castable as xs:decimal
  return 
    <WERT>     
      {$x}
    </WERT>
}
</erg>

Das Ergebnis dürfte wenig erstaunen:


<erg>
  <WERT>9</WERT>
  <WERT>6</WERT>
  <WERT>3</WERT>
</erg>

Freilich kann es passieren, daß die Sortierung nach einem String-compare erfolgt:


<erg>
{
  for $x in //Gehalt
  order by $x descending
  return 
    <WERT>     
      {$x/text()}
    </WERT>
}
</erg>

... wie wir hier sehen können:


<erg>
   <WERT>987.58</WERT>
   <WERT>876.54</WERT>
   <WERT>777.77</WERT>
   <WERT>6789</WERT>
   <WERT>654.21</WERT>
   <WERT>546.77</WERT>
   <WERT>5430</WERT>
   <WERT>456</WERT>
   <WERT>456</WERT>
   <WERT>357</WERT>
   <WERT>3450</WERT>
   <WERT>333.33</WERT>
   <WERT>321.45</WERT>
   <WERT>321</WERT>
   <WERT>234.56</WERT>
   <WERT>234</WERT>
   <WERT>222</WERT>
   <WERT>135</WERT>
   <WERT>1234.56</WERT>
</erg>

Daher ist es auch in XQuery sinnvoll, jedes Item der relevanten Sequenz nach seinem gewünschten Datentyp zu behandeln.


<erg>
{
  for $x in //xs:decimal(Gehalt/text())
  order by $x descending
  return 
    <WERT>     
      {$x}
    </WERT>
}
</erg>

Damit sieht das Ergebnis auch hier besser aus:


<erg>
   <WERT>6789</WERT>
   <WERT>5430</WERT>
   <WERT>3450</WERT>
   <WERT>1234.56</WERT>
   <WERT>987.58</WERT>
   <WERT>876.54</WERT>
   <WERT>777.77</WERT>
   <WERT>654.21</WERT>
   <WERT>546.77</WERT>
   <WERT>456</WERT>
   <WERT>456</WERT>
   <WERT>357</WERT>
   <WERT>333.33</WERT>
   <WERT>321.45</WERT>
   <WERT>321</WERT>
   <WERT>234.56</WERT>
   <WERT>234</WERT>
   <WERT>222</WERT>
   <WERT>135</WERT>
</erg

Auch hier können sämtliche Möglichkeiten der -Funktion ausgeschöpft werden, um die Sortierkriterien individuell zu gestalten.


<erg>
{
  for $x in sort(//xs:decimal(Gehalt), '',  
      function($v){ if ($v < 300 ) 
                    then ( $v * 10 ) 
                    else ( $v ) })
  return 
    <WERT>     
      {$x}
    </WERT>
}
</erg>

Durch den internen Aufruf der anonymen Funktion werden jene Einzelwerte, die kleiner sind als 300, jeweils um den Faktor 10 multipliziert. Dadurch erhalten sie einen effektiven internen Sortierwert:


   135    -> 1350
   222    -> 2220
   234    -> 2340
   234.56 -> 2345.6

... mit der Folge, daß sich auch die Reihenfolge der Sortierung ändert:


<erg>
   <WERT>321</WERT>
   <WERT>321.45</WERT>
   <WERT>333.33</WERT>
   <WERT>357</WERT>
   <WERT>456</WERT>
   <WERT>456</WERT>
   <WERT>546.77</WERT>
   <WERT>654.21</WERT>
   <WERT>777.77</WERT>
   <WERT>876.54</WERT>
   <WERT>987.58</WERT>
   <WERT>1234.56</WERT>
   <WERT>135</WERT>
   <WERT>222</WERT>
   <WERT>234</WERT>
   <WERT>234.56</WERT>
   <WERT>3450</WERT>
   <WERT>5430</WERT>
   <WERT>6789</WERT>
</erg

wg / 22. März 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XQuery3.html