J'ai une séquence qui doit trier une liste en fonction de la première année par rapport à la dernière année. En raison de certaines valeurs uniques dans l'élément year, cela rend le tri un peu plus compliqué. Existe-t-il un moyen de réaliser ce qui suit?

let $dates := ('1982', '2019', '2095', 'pre-1982', 'post-2095')
return    
for $date in $dates
order by $date
return $date

Le texte de l'élément dates est généralement l'année dans les données, mais les cas aberrants ont un pré-ou post-attaché. Un moyen d'y parvenir au minimum?

0
Mike J 27 août 2020 à 21:14

2 réponses

Meilleure réponse

Je ne sais pas si c'est minime, mais cela fonctionne:

let $dates := ('1982', '2019', '2095', 'pre-1982', 'post-2095')
return    
for $date in $dates
let $year := 
        if (fn:contains($date, "-")) 
        then fn:substring-after($date, "-") 
        else $date

let $prepost := 
        if (fn:starts-with($date, "pre")) 
        then -1 
        else if (fn:starts-with($date, "post")) 
        then 1
        else 0
order by $year, $prepost
return $date
3
Loren Cahlander 27 août 2020 à 19:59

Juste pour info: Certainement pas minimal, mais je voulais savoir ce que fn:sort fait quand une séquence est renvoyée. Il s'avère qu'il fait la bonne chose.

xquery version "3.1";

declare variable $local:ascending := 1;
declare variable $local:descending := -1;

declare function local:sort-prefixed-years ($y, $order) {
    if (fn:contains($y, "-")) 
    then (
        let $p := fn:tokenize($y, "-")
        let $m :=
            switch($p[1])
            case "pre" return -1 * $order
            case "post" return 1 * $order
            default return 0
        return (xs:integer($p[2]) * $order, $m)
    )
    else (xs:integer($y) * $order, 0)
};

declare function local:sort-prefixed-years-ascending ($prefixed-year) {
    local:sort-prefixed-years($prefixed-year, $local:ascending)
};

declare function local:sort-prefixed-years-descending ($prefixed-year) {
    local:sort-prefixed-years($prefixed-year, $local:descending)
};

let $dates := ('1982', '2019', '2095', 'pre-1982', 'post-2095')
return sort($dates, (), local:sort-prefixed-years-descending#1)
0
line-o 28 août 2020 à 22:24