如何在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在列表中的第一位。
答案 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'.