外观
运算符
条件、列、排序和引用都写在表对象里。键是「物理列名 + 后缀」,值是条件或路径。同一张表上的条件全部是 AND。值通过参数绑定进入 SQL,不会拼进语句文本。
后缀按最长匹配:!{}、{}、$、>=、<=、>、<、!,其余是等值。列名去掉后缀后仍必须是合法标识符,所以 id!> 不会变成「不等于再大于」。
json
{
"[]": {
"count": 10,
"User": {
"@column": "id,name:userName",
"@order": "id-,name+",
"sex!": 0,
"tag": null,
"id{}": ">=38710,<80000",
"name$": "%Tom%"
}
}
}条件
| 写法 | SQL |
|---|---|
"id": 1 | id = ? |
"tag": null | tag IS NULL |
"sex!": 0 | sex <> ? |
"sex!": null | sex IS NOT NULL |
"id>": 1 | id > ? |
"id>=": 1 | id >= ? |
"id<": 1 | id < ? |
"id<=": 1 | id <= ? |
"id{}": [1, 2] | id IN (?, ?) |
"id{}": "1,2" | id IN (?, ?) |
"id{}": 1 | id IN (?) |
"id!{}": 1 | id NOT IN (?) |
"id!{}": [1, 2] | id NOT IN (?, ?) |
"id!{}": "1,2" | id NOT IN (?, ?) |
"id{}": ">=10,<=20" | id >= ? AND id <= ? |
"id{}": ">=38710,<80000" | id >= ? AND id < ? |
"name$": "%Tom%" | name LIKE ? |
"name$": ["%a%", "%b%"] | (name LIKE ? OR name LIKE ?) |
"userId@": "/User/id" | 引用路径上的标量,按等值使用。见 引用赋值 |
JSON 整数按 64 位整数绑定,小数按十进制数绑定,字符串保持原文,布尔值保持布尔值。"1,2" 这种逗号字符串会按段解析:纯数字成为整数,带小数点的数字成为十进制数,其余保持字符串。段两侧的空白会去掉。
>、>=、<、<= 的值必须是非 null 标量。传入 null 或数组会拒绝。
{} 与 !{} 不接受 null,数组元素里也不能有 null。
空列表
| 写法 | 结果 |
|---|---|
"id{}": [] | 1 = 0,匹配 0 行 |
"id!{}": [] | 1 = 1,匹配全部行 |
"name$": [] | 1 = 0,匹配 0 行 |
区间
"列{}" 的值如果是字符串,并且某一段以 >、>=、<、<= 开头,整段按区间解析。各段之间是 AND。可以只写一段,例如 ">10"。
区间只适用于 {}。"id!{}": ">=1,<=2" 会拒绝。某一段不是比较符时也会拒绝,例如 "1,>=10"。
LIKE
列$ 的值是字符串,或字符串数组。数组各项用 OR 连接。% 和 _ 要写在值里,引擎不会自动补上。非字符串会拒绝。
@column
@column 是非空字符串,用逗号分隔。每一项是物理列名,或 列:别名。空白会去掉。
json
{ "User": { "@column": "id, name:userName" } }响应键使用别名;没有别名时使用列名。上面的行是 { "id": ..., "userName": ... }。别名保持请求中的大小写。达梦会把物理列折成大写再引用,别名仍然是 userName。
允许的写法只有列名和别名:
- 括号会被拒绝,例如
count(id)、表达式和子查询 - 别名不能为空,
id:会拒绝 - 输出名不能重复。重复看的是别名,没有别名则看列名
- 列名和别名都必须是合法标识符
省略 @column 时查询 SELECT *。响应字段名来自驱动返回的列标签。
@column 只在 GET 的选择列表里生效。HEAD 统计行数时忽略它。POST、PUT、DELETE 里出现 @column 或 @order 会拒绝。
@order
@order 是非空字符串,用逗号分隔。每一项是:
| 写法 | 顺序 |
|---|---|
id | 升序 |
id+ | 升序 |
id- | 降序 |
json
{ "User": { "@order": "id-, name+" } }对应 ORDER BY id DESC, name ASC。不接受 DESC、ASC 原文。空项会拒绝。排序列必须是合法标识符。
HEAD 忽略 @order。达梦上的分页建议写 @order,否则 OFFSET/FETCH 的行序不稳定。
引用赋值
列名@ 的值必须是路径字符串。解析到的标量按这一列的等值使用:查询和 DELETE 放进 WHERE,POST 放进 INSERT,PUT 在主键列上放进 WHERE、在其他列上放进 SET。
| 路径 | 含义 |
|---|---|
/User/id | 从本次响应根开始 |
User/id | 从当前数组元素向外找同级键,找不到再看根 |
[]/User/id | 最近一层数组元素 |
[]/[]/User/id | 再向外回退一层 |
json
{
"User": { "id": 38710 },
"Moment[]": {
"Moment": { "userId@": "/User/id" }
}
}同级键即使写在后面,也会按引用先执行。响应里的键顺序仍与请求一致。路径必须指向标量;指向对象或数组会拒绝。标识符不合法、路径为空、出现 //,或 [] 超出当前数组层级,都会拒绝。循环引用会拒绝。
引用不存在时,读操作得到 null(对象)或 [](数组)。写操作失败,整次请求回滚。
数组里,第一张不依赖兄弟键的表是主表,按 page / count 查询。其余对象表和嵌套数组按主表的每一行再查。详见 查询。
不会识别的写法
下面这些键不会被当成条件或功能符,请求会直接拒绝:
@raw、@group、@having,以及任何未知的@键- 正则
~ - 远程函数、存储过程、脚本条件
@column里的函数、子查询、表达式- POST 上的比较、
IN、LIKE等运算符。插入只接受字段值 - 写操作上的
@column、@order
根上的 @column 同样会拒绝。功能符属于表对象。