Formula 表达式
Formula 公式字段根据同一张表中的其他字段计算值。 计算结果为只读。 如需改变结果,请直接修改源字段中的值。
尝试一次简单计算
Section titled “尝试一次简单计算”在 Books 表格中添加两个整数字段:Pages 和 Pages read。 创建结果类型为 integer 的 Formula 字段,输入如下表达式:
"Pages" - "Pages read"在 Pages 中输入 120,在 Pages read 中输入 45。计算结果为 75。
将 Pages read 修改为 60,计算结果自动更新为 60。
若任一输入字段为空,表达式返回 null。
检查结果: 保存字段前,先查看表达式的实时预览。
Formula 使用带双引号的字段名称和一组固定的 SQLite 3.45 标量函数。 Runtime 会先解析表达式并检查数据类型,然后再生成 SQL 执行。 Formula 不能执行任意 SQL 语句。
- 使用确切的字段显示名引用字段:
"累计阅读时长(秒)"。 - 使用 SQLite
||运算符拼接文本。 - 使用
IS NULL或IS NOT NULL检查空值。 - 使用
CAST(value AS TEXT|INTEGER|REAL)进行类型转换。 - 使用
IIF(condition, trueValue, falseValue)或多分支CASE WHEN condition THEN value ELSE value END。 - 算术运算符支持
+、-、*、/、%。 - 比较运算符支持
=、==、!=、<>、<、<=、>、>=。
声明的结果类型必须精确指定为:text、number、integer、checkbox、date、datetime 或 url。
受支持的 SQLite 函数
Section titled “受支持的 SQLite 函数”| 分类 | 函数列表 |
|---|---|
| 空值与分支 | COALESCE、IFNULL、IIF、NULLIF |
| 数值计算 | ABS、CEIL、CEILING、FLOOR、ROUND、SIGN、标量 MAX、标量 MIN |
| 文本处理 | CHAR、CONCAT、CONCAT_WS、FORMAT、PRINTF、INSTR、LENGTH、OCTET_LENGTH、LOWER、UPPER、LTRIM、RTRIM、TRIM、REPLACE、SUBSTR、SUBSTRING、UNICODE |
| 模式匹配 | GLOB、LIKE |
| 类型检查 | HEX、QUOTE、TYPEOF |
| 日期时间 | DATE、DATETIME、TIME、JULIANDAY、UNIXEPOCH、STRFTIME、TIMEDIFF |
函数名大小写不敏感。 所有函数均遵循 SQLite 3.45 标准行为:
CONCAT将非空值转换为文本并忽略空值。SUBSTR与SUBSTRING索引从 1 开始。负数偏移量遵循 SQLite 标准规则。- 内置
LOWER与UPPER仅处理 ASCII 字符。 FORMAT与PRINTF使用 SQLite 格式化规则,不受系统区域设置影响。- 日期时间函数必须提供有效的时间值。
- 格式修饰符必须是字符串常量。Runtime 禁止使用
now、localtime、utc与auto,以保证跨平台计算的一致性与可复现性。 UNIXEPOCH禁止传入subsec与subsecond,确保输出结果始终为标准整数。
阅读时长格式化示例
Section titled “阅读时长格式化示例”以下表达式将 309299 秒格式化为 85小时55分钟,并将剩余秒数四舍五入到最近的分钟:
IIF( "累计阅读时长(秒)" IS NULL, NULL, FORMAT( '%d小时%d分钟', FLOOR("累计阅读时长(秒)" / 3600), ROUND(("累计阅读时长(秒)" % 3600) / 60) ))如果需要直接向下取整并忽略剩余秒数,请将分钟部分的 ROUND 替换为 FLOOR。
对于 309299 秒,计算结果为 85小时54分钟。
明确不支持的特性
Section titled “明确不支持的特性”Formula 不支持完整 SQL 语句、子查询与窗口函数。
它不支持表值函数、随机数生成与连接状态函数。
它不支持扩展加载与 JSON 函数。
旧版自定义函数名(如 IF、IS_NULL、DATE_ADD_DAYS)已废弃,请使用标准 SQLite 函数:
| 旧版拼写 | 标准 SQLite 拼写 |
|---|---|
IF(C, A, B) |
IIF(C, A, B) |
IS_NULL(X) |
X IS NULL |
LOWER_ASCII(X) / UPPER_ASCII(X) |
LOWER(X) / UPPER(X) |
DATE_ADD_DAYS(D, 7) |
DATE(D, '+7 days') |
DATE_DIFF_DAYS(A, B) |
CAST(JULIANDAY(A) - JULIANDAY(B) AS INTEGER) |
DATETIME_ADD_MILLISECONDS(D, 1000) |
DATETIME(D, '+1 second', 'subsec') |
DATETIME_DIFF_MILLISECONDS(A, B) |
CAST((JULIANDAY(A) - JULIANDAY(B)) * 86400000 AS INTEGER) |