(XQuery / Conditions)是否可以在if语句中声明变量?

时间:2017-03-16 11:31:51

标签: if-statement xquery exist-db

我找不到我的问题的例子,所以这是我的问题。 我在以下示例中收到一个错误,其他是一个意外的令牌:

let $var1 := 'true'
if ($var1 = 'true') then
    let $var2 := 1
    let $var3 := $var1 + 1
else ()

如您所见,如果if语句为true,我想声明变量。这可能在XQuery中吗?我刚看到一些例子,其中一个变量的值可以取决于条件。下面的内容或多或少与我想要在开头的代码中实现相同...并且它可以工作,但在我看来它有点令人困惑,实际上我不希望如果条件不是那么创建变量真正。此外,当你意识到这一点时,你必须考虑到这一点,特别是当有两个以上的变量相互依赖时。

let $var1 := 'true'
let $var2 := if ($var1 = 'true') then (1) else (0)
let $var3 := if ($var2 = 1) then ($var2 + 1) else (0)

所以我的问题是。有没有比我的解决方案更美观的解决方案?

3 个答案:

答案 0 :(得分:1)

您可以添加一个return子句,将完整的flwor表达式置于条件中,例如:像这样的东西:

df.index = df.index.year
s = s.div(df.Number, level=1)
print (s)

Component  Date  Sev Counts
PS         2009  3              0.500000
                 4              0.125000
           2010  1              0.666667
                 3              0.666667
                 4              0.333333
           2011  2              0.230769
                 3              0.384615
                 4              0.076923
           2012  1              0.500000
                 2              2.500000
                 3              3.500000
           2013  2              1.333333
                 3              3.000000
           2014  1              0.500000
                 2              0.750000
                 3              1.000000
           2015  1              0.333333
                 2             16.666667
                 3              5.166667
                 4              5.166667
           2016  1              0.619718
                 2              0.380282
                 3              0.633803
dtype: float64

但这没有意义:$ var2和$ var3的绑定不会扩展到then子句的范围之外。

答案 1 :(得分:1)

XQuery是一种声明性和功能性语言,这意味着变量不会被赋值,而只能绑定在某个范围内。这是一个应该考虑空间而不是时间的东西,因为XQuery程序中没有时间,比如票可以让你访问博物馆而不是另一个。

让子句是FLWOR(for-let-where-orderby-return)表达式的首字母缩写的一部分。 let子句中的变量绑定可以在后续子句中使用,直到并包括return子句。正如mholstege所解释的那样,超出return条款,这是必需的,变量不再可见,就像没人会接受你在博物馆外的票。

由于表达式根据XQuery语法以“井括号”的方式嵌套,因此任何在let表达式中启动if-then-else子句的尝试都需要存在return子句在then(或else)表达式结束之前。这意味着在此if-then-else表达式之后,以这种方式绑定的变量将永远不可见。

一般来说,当我使用XQuery编程(而不是Java)时,我会不断提醒自己,我必须写下我想要的,并抵制描述的诱惑我希望如何计算

话虽如此,XQuery确实有scripting extensions引入了你所描述的变量赋值,但到目前为止还没有标准化 - 而且,这样的脚本扩展只应在对外界的副作用时使用发生,意味着需要一个时间概念和成功的快照。

答案 2 :(得分:0)

您可以通过定义可能值的序列来避免使用if / else,并使用谓词计算position()以从序列中选择所需的值:

以下使用number()来计算布尔值的数值(0表示false,1表示true),并选择值序列中的第一个或第二个项目:

let $var1 := 'true'
let $var2 := (0, 1)[number($var1 = 'true') + 1]
let $var3 := (0, $var2 + 1)[number($var2 eq 1) + 1]
return ($var1, $var2, $var3)