# SQL 函数

DexSQL 接受 SQLite 内置函数的一个子集。不在列表里的会在解析期被拒（`function call is outside the DexSQL read-only subset`），而不是悄悄算错。

**标量函数**

| | |
| --- | --- |
| 文本 | `length` `substr`/`substring` `upper` `lower` `trim` `ltrim` `rtrim` `replace` `instr` `hex` `quote` `unicode` `char` |
| 数值 | `abs` `min(a, b, …)` `max(a, b, …)` |
| 空值 / 条件 | `coalesce` `ifnull` `nullif` `iif` |
| 类型 | `typeof` |
| DEX 专用 | `dex_java_name` |

`dex_java_name` 把 DEX 类型 descriptor 渲染成 Java 风格名字——`dex_java_name('Lcom/f/B;')` 得到 `com.f.B`，`[I` 得到 `int[]`，`V` 得到 `void`。它就是 `types.java_name` 背后的那个函数，直接内联调用和读那一列享受同样的处理。

`min` / `max` 传两个及以上参数时是标量函数，传一个时是聚合函数。

**聚合函数**

`count(*)` `count(x)` `count(DISTINCT x)` `sum` `avg` `total` `min` `max` `group_concat(x)` `group_concat(x, sep)` `string_agg(x, sep)`

`group_concat` 支持排序，这是让拼接结果确定的关键：`group_concat(value, ',' ORDER BY ordinal)`。`protos` 视图的 `param_descriptors` 就是这么来的。

`char(...)` 按码点构造文本；`char()` 返回空文本。U+0000 会保留，补充平面字符在内部使用 MUTF-8 代理对。输出转换和原始字节转换见[文本值](index.zh.md#文本值)。

**窗口函数**

`row_number()` `rank()` `dense_rank()` `ntile(n)` `lag(x[, offset[, default]])` `lead(x[, offset[, default]])` `first_value(x)` `last_value(x)`，以及带 `OVER (...)` 的 `count`、`sum`、`avg`、`min`、`max`。不支持 DISTINCT 窗口聚合。不支持的名称、参数数量或窗口形式会返回错误。

---

Copyright (c) 2026 LSPosed Developers。本文档采用 [MIT 许可证](../license.md)。
