【问题标题】:What is the XQuery equivalent of the ESQL COALESCE function?ESQL COALESCE 函数的 XQuery 等价物是什么?
【发布时间】:2015-12-05 08:44:19
【问题描述】:

我正在尝试将 WMB 7 映射节点转换为 IIB 9 节点。自动转换过程将一些 ESQL 函数转换为 XQuery 函数。

具体来说就是转ESQL函数

COALESCE (var0, var1) 

(返回第一个非空值,如if var0 = null then var1 else var0)放入

XQUERY (var0,var1)
  1. 转换是否正确?

  2. 如果是,有人可以提供 API 的链接吗?我在 XQuery 语法和操作手册上找不到这个。

【问题讨论】:

    标签: sql xquery ibm-integration-bus extended-sql


    【解决方案1】:

    XQuery 不是 API,而是标准,完整的语法可以在网上找到:XQuery 1.0XQuery 3.0(没有 2.0)。您还可以找到许多手册、教程等。

    XQuery 依赖于XPath,它比 XQuery 使用更广泛,几乎可以在所有通用语言的库中找到。

    您的表达式是正确的 XQuery,因为它将所有内容都视为一个序列,并且逗号连接(和展平)两个序列。

    XPath 不知道NULL,但它知道xsi:nil(),后者是空序列。从结果中删除一个空序列。

    我不确定下面使用的是什么 XQuery 处理器,但正确的表达式应该是 ($var0, $var1)[1]2,它的工作方式与您的 COALESCE 操作相同1。在 XPath 和 XQuery 中,变量用$ 符号引用。用逗号分隔的变量或表达式的数量是无限的。如果都是空序列(null),则结果为空序列。

    如果没有[1],它将返回所有非空项并丢弃其余项。您可以使用另一个索引,如[3] 来获取第三个非空值。如果不存在这样的值,它将返回 null(空序列)。


    1其行为与您描述的不完全一样。我相信它的行为类似于if var0 == null then var1 else var0,它选择第一个非空值(我已经更新了 OP)。

    2正如 Florent 在 cmets 中解释的那样,带有此表达式的警告已经到位。如果您有$var1 := (1, 2)$var2 := (3, 4),则表达式$var1, $var2)[1] 将返回1,而不是(1, 2),因为序列不能包含子序列,并且使用[x] 索引序列将返回xth 展平序列的值。你可以用(zero-or-one($var1), zero-or-one($var2))[1]保护你的表达。

    【讨论】:

    • 我知道我在描述 COALESCE 时并不准确,我的目标是简单。
    • np,我对它很熟悉,大多数 sql 变体都有它。请注意,在 XPath 中,序列是有序的,不能包含子序列(展平)并且可以有任何长度。因此,($a, $b, $c, $d, $e)[1] 将返回五个非空值中的第一个,如果没有 [1],它将返回所有非空值(q.更新)。
    • 我经常使用这个成语(即(a,b)[1])。但是您必须非常小心 ab 包含每个 0 或 1 项。如果不是,则此表达式将默默忽略除第一项之外的所有内容。因此,仅当您使用? 声明变量的基数时才使用它。如果没有,使用fn:zero-or-one() 或使用成熟的if-then-else 更安全。
    • @FlorentGeorges 同意,警告已到位,我已根据您的建议更新了答案:)
    • 好吧,我不确定你的例子是否更容易混淆:-) 没有((), 2) 这样的东西。也许一个更好的例子是(1, 2)(3, 4),并警告($a, $b)[1] 只返回1(作为(1, 2, 3, 4) 中的第一项),而不是$a 的完整值(因为有没有嵌入序列,它们被“扁平化”......
    猜你喜欢
    • 2023-01-17
    • 2011-12-11
    • 1970-01-01
    • 2018-08-21
    • 2020-02-13
    • 2011-12-25
    • 2019-12-07
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多