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, dass die Sortierung nach einem String- erfolgt:


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

... wie Sie 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 in XQuery sinnvoll, jedes Item der relevanten Sequenz nach seinem gewünschten Datentyp zu behandeln. In diesem Fall wird jedes Item als xs:decimal gecastet.


<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 werden jene Einzelwerte, die kleiner sind als 300, jeweils mit dem Faktor 10 multipliziert. Dadurch erhalten sie einen effektiven internen Sortierwert:


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

... mit der Folge, dass 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 / 12. August 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.






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