本主题描述如何使用 SELECT 函数和其他列函数处理消息树中的重复字段
假设您要对总订单值大于特定金额的发票执行特殊操作。为计算 Invoice 字段的总订单值,必须用 Price 字段乘以消息中所有 Item 的 Quantity 字段,然后得出总值。您可以使用 SELECT 表达式执行此操作,如下所示:
( SELECT SUM( CAST(I.Price AS DECIMAL) * CAST(I.Quantity AS INTEGER) ) FROM Body.Invoice.Purchases."Item"[] AS I )
此示例假设您需要使用 CAST 表达式将字段 Price 和 Quantity 的字符串值强制转换为正确的数据类型。Price 字段强制转换为十进制值时会生成一个带有自然小数位数和精度的十进制值,即,任何小数位数和精度对于显示数值来说都是必需的。 如果数据已是适当的数据类型,则不必进行这些 CAST。
SELECT 表达式的工作方式与定量谓词类似,在标准数据库 SQL 中运行的 SELECT 更是相同。FROM 子句指定要迭代的内容,在本例中,迭代 Invoice 中的所有 Item 字段,并构建可以使用 I 引用 Item 的当前实例。这种格式的 SELECT 需要使用列函数,在本例中是 SUM 函数,因此 Invoice 中每个 Item 字段的 SUM 函数中的表达式结果加起来就是 SELECT 的值。与标准 SQL 一样,列函数忽略 NULL 值(下面说明的 COUNT 列函数例外),并且仅在没有要组合的非 NULL 值时,列函数才返回 NULL 值。
提供的其他列函数是 MAX、MIN 和 COUNT。COUNT 函数有两种格式,它们使用不同的方法处理 NULL 值。第一种格式的使用方法与上述 SUM 函数的使用方法非常相似,例如:
SELECT COUNT(I.Quantity) FROM Body.Invoice.Purchases."Item"[] AS I
此表达式返回 Quantity 字段是非 NULL 值的 Item 字段的数量。即,COUNT 函数统计非 NULL 值,统计方法与 SUM 函数添加非 NULL值的方法相同。使用 COUNT 函数的另一种方法如下所示:
SELECT COUNT(*) FROM Body.Invoice.Purchases."Item"[] AS I
无论字段值是否为 NULL,都使用 COUNT(*) 统计 Item 字段的总数。上述示例实际上等同于使用 CARDINALITY 函数, 如下所示:
CARDINALITY(Body.Invoice.Purchases."Item"[]
在此处给出的所有 SELECT 示例中,就象在标准 SQL 中那样,可以使用 WHERE 子句对字段进行过滤。