活字格 OData 查询完全指南:从基础到高级

概述

OData(Open Data Protocol)是活字格中获取数据的重要方式。正确使用 OData 可以大幅提升开发效率,但滥用也会导致性能问题。本文从基础语法到高级技巧,全面讲解 OData 的使用方法。

一、OData 基础语法

// 基本格式
=ODATA("表名?$查询参数")

// 获取单条数据
=ODATA("客户表?$filter=ID eq 1")

// 获取关联字段
=ODATA("客户表?$filter=ID eq "&[客户ID]&"&$select=名称")

// 获取记录数
=ODATA("订单表?$filter=状态 eq '待审核'&$count=true/$count")

二、常用查询操作符

操作符说明示例
eq等于$filter=状态 eq '已完成'
ne不等于$filter=ID ne 0
gt / ge大于 / 大于等于$filter=金额 gt 1000
lt / le小于 / 小于等于$filter=日期 lt 2024-01-01
and / or与 / 或$filter=状态 eq '完成' and 金额 gt 100
startswith以...开头$filter=startswith(名称,'北京')
contains包含$filter=contains(备注,'紧急')

三、排序和分页

// 排序:升序 asc,降序 desc
=ODATA("订单表?$orderby=创建日期 desc")

// 多字段排序
=ODATA("订单表?$orderby=状态 asc, 金额 desc")

// 分页:跳过前20条,取10条
=ODATA("订单表?$skip=20&$top=10")

四、关联查询($expand)

// 查询订单时同时获取客户信息
=ODATA("订单表?$expand=客户表&$select=订单号,客户表/名称")

注意:$expand 性能开销较大,大数据量场景慎用。

五、聚合查询

// 求和
=ODATA("订单表?$apply=aggregate(金额 with sum as 总金额)")

// 计数
=ODATA("订单表?$apply=groupby((状态),aggregate($count as 数量))")

// 平均值
=ODATA("订单表?$apply=aggregate(金额 with average as 均价)")

六、OData 性能优化技巧

1. 避免在表格中使用 OData

表格中每个 OData 公式都会产生独立的网络请求。100 行数据 = 100 次请求 = 严重卡顿。

// ❌ 错误:表格中使用 OData
=ODATA("部门表?$filter=ID eq "&[部门ID]&"&$select=名称")

// ✅ 正确:创建数据库视图关联查询
// CREATE VIEW v_员工_部门 AS
// SELECT e.*, d.名称 as 部门名称
// FROM 员工 e LEFT JOIN 部门 d ON e.部门ID = d.ID

2. 只查询需要的字段

// ❌ 返回所有字段
=ODATA("产品表?$filter=ID eq 1")

// ✅ 只返回需要的字段
=ODATA("产品表?$filter=ID eq 1&$select=名称,价格,库存")

3. 利用缓存

// 对于不常变化的数据(如字典表),在页面加载时一次性获取
// 存入 JavaScript 变量或辅助表中,后续直接使用缓存数据

七、常见错误和解决方案

错误原因解决方案
返回 #VALUE!OData 语法错误检查引号、括号是否匹配
返回空值无匹配数据使用 IFERROR 处理空值
页面卡顿OData 过多改用视图或服务端命令

八、使用 IFERROR 处理异常

=IFERROR(ODATA("客户表?$filter=ID eq "&[客户ID]&"&$select=名称"), "未知客户")

总结

OData 是把双刃剑——用得好事半功倍,用不好性能灾难。记住一条黄金法则:表格中不要用 OData,改用视图;页面上谨慎用 OData,一次不超过 5 个。

标签: