本帖最后由 adminlily 于 2020-12-4 16:37 编辑
OQL基本语法
在OQL中当前只支持一种语句: SELECT SELECT语句的语法如下:
SELECT
output_specification 表示想要检索对象的类,省略时默认为class_reference。它由一组类名组成时,第一个别名将确定所期望的主类是什么。 class_reference 表示想要去查询的对象的类。 class_joined 表示您想要连接的一系列类,以限制所选对象的集合(请记住,不用对具体列进行操作)。 where_condition 是一个表达式,也就是SQL SELECT语句中的查询条件。 在iTop 2.2.0之后 oql_query 是另一个完整的OQL查询语句,它的查询结果将被添加到SELECT的结果中。
output_specificationclass_alias [, output_specification]
class_reference
class_name [AS class_alias]
class_name or class_alias
name | `name`
下列情况中必须使用倒引号:
类的名字和保留字冲突 (比如: JOIN…), 类的名字包含不希望出现的字符。
class_joined
JOIN class_reference ON class_left.external_key join_operator class_right.id
class_reference 指在JOIN左边或者右边的类,取决于数据模型和给定的外键。 class_right.id 虽然不可能是其他值,但是必须指定:它引用了另一个对象指向的对象。如果给定了的话,Class_right是一个别名。 class_left.external_key 指的是指向 class_right.id的类的对应属性。很多情况下,外键属性可以猜到,但是无论如何引用必须被清楚地指定。在2.2.0中最新:这个特殊的属性可以是 'AttributeObjectKey'类型。 join_operator 连接操作符可以是 =, BELOW, BELOW STRICT, ABOVE 或者 ABOVE STRICT。BELOW,ABOVE 只能用于连接 AttributeHierarchicalKey类型的属性。
表达式
literal
| function
| attribute
| expression operator expression
| (expression)
literal 是一个字符串(用单引号或者双引号括起来),或者一个数字(只支持整数). 版本2.0.1新引入: 十六进制符号支持无符号整数最大 2^64 (如: 0x2F6C585B5FEACF7A 不带引号)。 function 是上述动词之一,参数使用逗号分隔的表达式列表。 attribute 是一个定义在数据模型的对象属性的引用, class_ref.attribute_code – 使用倒引号解决保留字符或空白字符冲突是很必要的。 operator 下列任何的二元运算符。 expression 使用圆括号可以处理运算符之间的优先级别。
二元运算符
二元运算符接受两个操作数:左右各一。
运算符 | 描述 | AND | 逻辑与 | OR | 逻辑或 | / | 除法运 | = | 等于 | >= | 大于等于 | > | 大于 | <= | 小于等于 | < | 小于 | - | 减法 | <> | 不等于 | LIKE | 简单模式匹配 | NOT LIKE | 简单模式非匹配 | IN | 列表 | NOT IN | 不在列表中 | & | 在2.0.1中新增:位操作符”and“。这个操作符不同于“逻辑”操作符“AND“,因为它对每个数字的位进行操作。
| | | 在2.0.1中新增:位操作符”or“。这个操作符不同于“逻辑”操作符“OR“,因为它对每个数字的位进行操作。
| ^ | 在2.0.1中新增:位操作符”xor“。异或。
| << | 在2.0.1中新增:位操作符左移。
| >> | 在2.0.1中新增:位操作符右移。 | REGEXP | 正则表达式 | MATCHES | 在2.0.1中新增:全文匹配字符串。此操作符仅用于TagSet类型的属性。支持的语法是属性匹配'code1 code2'
|
通配符
在编写OQL时,可以根据当前用户及其关联的联系人指定占位符。
占位符 | 内容 | :current_contact→id | 定义一个OQL“查询菜单”或者“dashlet”,返回用户依赖数据
| :current_contact→attribute | 联系人类的属性
| :current_user→attribute | 用户类的属性
|
例如,标准“帮助台”菜单“分配给我的请求(作为代理)”
SELECT UserRequest WHERE agent_id = :current_contact->id AND `status` NOT IN ('closed', 'resolved')
函数
verb(expression[,expression [,expression...]...] ...])
在SQL中,所有函数实际上都映射到SQL对应的函数。换句话说,最终执行的SQL查询将使用相同的函数。 因此,这些函数的规范(参数的个数和类型、返回值)类似于底层数据库服务器的规范。任何限制或副作用都与数据库引擎的版本有关。
下面提供的超链接将指向mySQL 5.0的参考文档,是推荐的标准数据库引擎(用于OQL处理)文档。
函数名称 | 描述 | 示例 | IF | If/else 结构 | IF(a=b, 'equals', 'differs') | ELT | 返回索引的字符串 | ELT(index, 'string1', 'string2', 'string3') | COALESCE | 返回第一个非空参数
| COALESCE(field1, field2, 'Undefined') | ISNULL | | ISNULL(field1) | CONCAT | 返回连接后的字符串
| CONCAT(firstname, ' ', lastname) | SUBSTR | 返回指定的子字符串 | SUBSTR('abcdef', 2, 3) | TRIM | 删除开头和结尾的空格 | TRIM(' blah ') | DATE | 提取日期或日期时间表达式的日期部分
| DATE() | DATE_FORMAT | 指定格式日期
| DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y') | CURRENT_DATE | 返回当前日期 | CURRENT_DATE() | NOW | 返回当前日期和时间 | NOW() | TIME | 提取表达式的时间部分
| TIME() | TO_DAYS | 返回日期参数转换后的天数
| TO_DAYS('2009-05-01') | FROM_DAYS | 转换一个日期数为日期
| FROM_DAYS(12345) | YEAR | 返回日期的年
| YEAR(DATE()) | MONTH | 返回日期的月
| MONTH(DATE()) | DAY | 返回日期的日 (0-31)
| DAY(DATE()) | DATE_ADD | 添加时间值(间隔)到日期。参见下面允许的间隔单位
| DATE_ADD(NOW(), INTERVAL 1 HOUR) | DATE_SUB | 缩短时间值(间隔)到日期。参见下面允许的间隔单位
| DATE_SUB(NOW(), INTERVAL 5 MINUTE) | ROUND | 返回参数X的四舍五入的数值。 | ROUND(12.356, 2) | FLOOR | 返回不大于参数的最大整数值
| FLOOR(12.356) | INET_ATON | 返回IP地址的数值
| INET_ATON('15.15.121.12') | INET_NTOA | 返回数值的IP地址
| INET_NTOA(1231654) |
DATE_ADD和DATE_SUB函数当前支持的时间间隔单位列表,MySQL中允许的值的子集。
OQL接受:
时间间隔单位 | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND |
|