如何在xquery中首先按特定值排序?

时间:2013-11-21 12:51:08

标签: xml xquery

如何在xQuery中首先按特定值排序?

示例:

<xml>
    <b>
        <msg>A</msg>
        <val>5</val>
    </b>
    <b>
        <msg>B</msg>
        <val>1</val>
    </b>
    <b>
        <msg>C</msg>
        <val>3</val>
    </b>
    <b>
        <msg>K</msg>
        <val>2</val>
    </b>
    <b>
        <msg>D</msg>
        <val>3</val>
    </b>
</xml>

我希望基于有序值得到,但值应该是3在列表中的第一位。

3 个答案:

答案 0 :(得分:3)

你可以在你的order by子句中写一个表达式,这样你就可以做这样的事情(虽然可能有更好的方法):

for $b in //b
order by if ($b/val = 3) then (0) else (1), $b/msg 
return $b

答案 1 :(得分:2)

看来你的价值都在自然数的集合中。然后,您可以选择一个小于自然数中所有其他值的值 - 例如-1。如果值为3,请将其替换为-1的排名,否则请使用正常值。

for $b in //b
let $rank := if ($b/val = 3) then -1 else $b/val/number()
order by $rank ascending
return $b

您没有提供任何预期输出的提示。如果您只想要数字或任何输出,只需修改return语句。

答案 2 :(得分:0)

As suggested by Ewout Graswinckel, I followed the steps. It worked. Thanks a lot.

We can order by more "based-on-condition" by adding ","

such as like this - 

(for $x in (doc('')) 
 order by if ($x//val = 3) then (0) else (1), 
    if (contains($x//msg, 'A')) then (0) else (1)
return $x 
 )

So after val = 3 , next order by will be anything which contains 'A'.