关于OQL
(一)什么是 OQL
OQL (Object Query Language) 是平台提供的一种针对面向对象数据库设计的查询语言标准,采用类似 SQL 的语法对记录进行 CRUD。目前低代码开发者可以在「函数」中以 SDK 的方式使用 OQL。
(二)和现有链式 DB 接口的区别
- 采用 SQL 风格的数据操作方式;
- 在链式接口的能力上有扩充,通过链式接口无法实现或实现起来比较复杂的数据操作,可通过 OQL 来实现。如聚合计算、Hierarchy 查询、查询结果的行内计算等。
使用方式
注意事项:
- 单次查询的数据量限制为 200(含聚合计算的查询为 1000);
- 单次创建、更新、删除的数据量限制为 100;
- 字符串类型的值,需要使用单引号。
规则对照表
基础关键字
勾选项为已支持内容,未勾选项会陆续迭代支持
| 关键字 | 语法 | 示例 | 
| ☑️ SELECT ☑️ FROM ☑️ WHERE ☑️ AS |   SELECT  expression [ [ AS ] alias ] [, ...]     [ FROM object_source [ [ AS ] alias] ]     [ WHERE expression ]  |   SELECT _name, age FROM employee WHERE age > 30;  | 
|  ☑️ LIMIT ☑️ OFFSET |   LIMIT [offset,] count [ OFFSET offset ]  LIMIT 20; LIMIT 30,20; LIMIT 20 OFFSET 30;  |   SELECT _name, _createdAt, _updatedAt FROM _user LIMIT 20 OFFSET 30;  | 
|  
 |   SELECT DISTINCT expression [, ...]  |   SELECT DISTINCT _name FROM _user;  | 
| ☑️ GROUP BY 
 支持的字段类型: 
 |   GROUP BY fieldApiname [, ...]; HAVING condition;  |   SELECT service_id, COUNT(package_name) FROM cloud_function_npm_package GROUP BY service_id  /* GROUP BY 位置引用(如下例,按 select 的第1 个 字段来 group by,可以避免重复写表达式) */ SELECT package_name, COUNT(package_name) FROM cloud_function_npm_package GROUP BY 1  /* GROUP BY alias */ SELECT package_name AS package, COUNT(package_name) FROM cloud_function_npm_package GROUP BY package  | 
| ☑️ ORDER BY ☑️ ASC ☑️ DESC ☑️ NULLS FIRST ☑️ NULLS LAST |   ORDER BY expression [ ASC | DESC] [ NULLS { FIRST | LAST } ] [, ...]  |   SELECT _name, _createdAt, _updatedAt FROM _user ORDER BY _createdAt, _updatedAt DESC   /* ORDER BY 位置引用 */ SELECT _name, _createdAt, _updatedAt FROM _user ORDER BY 2, 3 DESC  /* ORDER BY alias */ SELECT _name, _createdAt AS createAtAlias FROM _user ORDER BY createAtAlias  | 
| ☑️ Subquery 
 
 
 |   SELECT expression [, ...] FROM table_name WHERE column IN (SELECT expression [, ...]  FROM table_name WHERE condition);  |   SELECT Websites.name, Websites.url  FROM Websites  WHERE id (SELECT website_id     FROM access_log      AND count > 200);  | 
|  
 |   SELECT expression [, ...]  FROM table1 UNION SELECT expression [, ...]  FROM table2;  |   SELECT _name, _email FROM _user WHERE _department._id=123 UNION SELECT manager._name, manager._email FROM project WHERE _id=456;  | 
| ☑️ COUNT ☑️ COUNT(DISTINCT) ☑️ SUM ☑️ AVG ☑️ MAX ☑️ MIN 支持的字段类型: 
 
 
 
 
 
 
 
 |   SELECT COUNT(*) SELECT COUNT(fieldApiName) SELECT COUNT(DISTINCT fieldApiName) SELECT SUM(fieldApiName) SELECT AVG(fieldApiName) SELECT MAX(fieldApiName) SELECT MIN(fieldApiName)  |   SELECT COUNT(_id)  FROM _user;  | 
| ☑️ ARRAY 把多个值组合成一个数组,值必须是相同类型 |   ARRAY[value1, value2]  |   SELECT _id  FROM _user  WHERE HIERARCHY(_manager) && ARRAY[1001];  | 
| ROW 把多个值组合成一个数组,值可以是不同类型 |   ROW(value1, value2)  |  | 
| ☑️ AND ☑️ OR |   boolValue1 AND boolValue2 boolValue1 OR boolValue2  |   SELECT _name FROM _user WHERE age > 10  AND age < 20;  | 
| ☑️ NOT |   NOT boolValue1  |   SELECT _name FROM _user WHERE NOT (age > 10)  | 
| ☑️ IS NULL ☑️ IS NOT NULL |   fieldApiName IS NULL  |  | 
| ☑️ IS TRUE ☑️ IS NOT TRUE ☑️ IS FALSE ☑️ IS NOT FALSE ☑️ IS UNKNOWN ☑️ IS NOT UNKNOWN |   fieldApiName IS TRUE  |  | 
| ☑️ IS DISTINCT FROM ☑️ IS NOT DISTINCT FROM |   fieldApiName IS DISTINCT FROM value1  |  | 
| ☑️ IN ☑️ NOT IN 支持的字段类型: IN:Text、Number、Option、Lookup NOT IN:Option、Lookup |   IN (value1,value2,...);  |   SELECT _name FROM _user WHERE _id IN (123, 234, 345)  | 
| ☑️ BETWEEN ☑️ NOT BETWEEN |   column_name BETWEEN value1 AND value2;  |   age BETWEEN 10 AND 20;  | 
| ☑️ LIKE ☑️ NOT LIKE 仅支持 % .. % 格式 |   fieldApiName LIKE '%ab%'  |   SELECT _id  FROM _user  WHERE _name LIKE '%ab%';  | 
| ☑️ AT TIME ZONE  ☑️ AT LOCAL AT LOCAL 是依据用户当前时区 |   AT TIME ZONE '+08:00' AT LOCAL  |   SELECT _createdAt AT TIME ZONE '+08:00' FROM _user  | 
| ☑️ CAST 支持转化为的类型有: STRING | BINARY | INT | DOUBLE | DECIMAL | ENUM | BOOLEAN | DATE | TIMESTAMP | TIMESTAMPTZ | objectName | objectName ID | ARRAY) 字段和数据类型对照表详见后文 |   CAST(value1 AS type1)  |   SELECT CAST(_id AS STRING) FROM info  | 
|  ☑️ EXTRACT |   EXTRACT(part FROM datetimeValue1)  |   SELECT EXTRACT(YEAR FROM _createdAt) FROM _user  | 
| ☑️ CURRENT_DATE ☑️ CURRENT_TIME ☑️ CURRENT_TIMESTAMP ☑️ LOCALTIME ☑️ LOCALTIMESTAMP |   CURRENT_DATE CURRENT_TIMESTAMP CURRENT_TIMESTAMP(3)  |   SELECT _id FROM _user WHERE _createdAt < CURRENT_TIMESTAMP  | 
| ☑️ INNER JOIN ☑️ LEFT JOIN ☑️ RIGHT JOIN ☑️ ON |   objectApiName2 INNER JOIN objectApiName2 ON condition  |   SELECT customer_info.firstname, customer_info.lastname, purchases.item FROM customer_info INNER JOIN purchases ON customer_info.customer_number = purchases.customer_number;  | 
| ☑️ /* */ |   /* 这是注释 */  |   SELECT _id /* 这是注释 */ FROM _user  | 
|  ☑️ INSERT INTO |   INSERT INTO objectApiName  (fieldApiName1, fieldApiName2, ...)  VALUES (value1, value2, ...), (value1, value2, ...) [ RETURNING fieldApiName1, fieldApiName2, ... ]  |   INSERT INTO _user (_type, _manager)  VALUES ('_employee', 1001) RETURNING _id  | 
|  ☑️ UPDATE 必须有 where 条件 且 where 条件只能是 _id = 或 _id IN 或其他等价条件 |   UPDATE objectApiName  SET fieldApiName1 = value1, fieldApiName2 = value2, WHERE condition [ RETURNING fieldApiName1, fieldApiName2, ... ]  |   UPDATE _user SET _manager = 1002  WHERE _id = 1001 RETURNING _id  | 
|  ☑️ DELETE FROM where 条件同 UPDATE |   DELETE FROM objectApiName  WHERE condition [ RETURNING fieldApiName1, fieldApiName2, ... ]  |   DELETE FROM _user  WHERE _id = 1001 RETURNING _id  | 
特殊关键字
操作符
| 操作符 | 语法 | 示例 | 
| ☑️ [] ☑️ [:] |   arrayValue[index] arrayValue[low:high]  |  | 
| ☑️ = ☑️ <>  != ☑️ < ☑️ > ☑️ <= ☑️ >= |   fieldApiName > value1  |   SELECT _id  FROM _user  WHERE age > 100;  | 
| ☑️ + ☑️ - ☑️ * ☑️ /  ☑️ % |   -numericValue1 numericValue1 + numericValue2  |  | 
| ☑️ && |   multiValueFieldApiName && ARRAY[value1, value2, ...]  |   SELECT _id  FROM info  WHERE colors && ARRAY['red', 'green']  | 
| ☑️ || 字符串拼接 |   value1 || value2  |   /* text 字段的所有返回结果后拼接字符串 '_suffix' */ SELECT text || '_suffix'  FROM info  | 
字段数据类型
字段的值在 OQL 中会转换为以下数据类型,同样地,OQL 的返回结果会依据字段类型转换成等效的 JS 数据类型:
- 例如 OQL 的 JSON 类型自动转换成 JS 的 Object 或者 Array,其在 OQL 内部不是 Array,即不能用 Array 的操作符(如下标运算)。
| 字段类型  | OQL 数据类型  | 
| 关联对象 lookup (单值) | Object ID | 
| 文本 text 邮箱 email 自动编号 auto_number | STRING  | 
| 手机号码 phone | JSON  | 
| 数字 float | DOUBLE | 
| 加密数字 encryptNumber | DECIMAL | 
| 布尔 boolean | BOOLEAN | 
| 选项 enum (单值) | ENUM | 
| 日期 date | DATE | 
| 日期时间 datetime | TIMESTAMPTZ | 
| 选项 enum(多值) | STRING[] | 
| 关联对象 lookup (多值) 反向关联 back_lookup | Object ID[] | 
| 组合类型 compositeType (单值) 多值取单值 extractCompositeType | CompositeType | 
| 组合类型 compositeType (多值) | CompositeType[]  CompositeType ARRAY | 
| 多语文本 multilingual  | JSON | 
| 富文本 richText 头像/标识 avatar 文件 attachment | JSON  | 
| 公式 formula | 返回值字段类型对应的数据类型 | 
| 引用字段 reference_field | 引用的字段类型对应的数据类型 | 











