Skip to content

运算符 ​

条件、列、排序和引用都写在表对象里。键是「物理列名 + 后缀」,值是条件或路径。同一张表上的条件全部是 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": 1id = ?
"tag": nulltag IS NULL
"sex!": 0sex <> ?
"sex!": nullsex IS NOT NULL
"id>": 1id > ?
"id>=": 1id >= ?
"id<": 1id < ?
"id<=": 1id <= ?
"id{}": [1, 2]id IN (?, ?)
"id{}": "1,2"id IN (?, ?)
"id{}": 1id IN (?)
"id!{}": 1id 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 同样会拒绝。功能符属于表对象。