写 filter、select 中的计算字段时,会用到比较、文本、数字、日期、空值处理等表达式和函数。本节按用途分类列出常用写法。
|
操作符 |
说明 |
|---|---|
|
|
等于、不等于(操作数有空则结果为空集) |
|
|
等于、不等于(可与空值比较) |
|
|
小于、大于、小于等于、大于等于 |
与可选参数或可能为空的字段比较时,用 ?=、?!=。
|
写法 |
说明 |
|---|---|
|
|
判断 x 是否在集合中 |
|
|
判断集合是否非空 |
示例:统计状态为「草稿」或「已确认」的订单数。
select count(Order filter .status in {'draft', 'confirmed'})
结果示意:
5
|
写法/函数 |
说明 |
|---|---|
|
|
字符串拼接 |
|
|
大小写敏感匹配 |
|
|
大小写不敏感匹配 |
pattern 中 % 表示任意字符序列,_ 表示任意单字符。
|
函数 |
说明 |
|---|---|
|
|
字符串长度 |
|
|
是否包含子串 |
|
|
转小写/大写 |
|
|
去掉首尾指定字符,默认空格 |
|
|
替换 |
|
|
按分隔符拆成数组 |
|
|
转为字符串(数值、日期等) |
示例:订单号与状态用下划线拼接为描述。
select Order {
order_no,
status,
desc := .order_no ++ '_' ++ .status
}
结果示意:
[
{ "order_no": "ORD001", "status": "draft", "desc": "ORD001_draft" }
]
多语言属性底层为 JSON(如 {"zh-cn": "华东客户", "en": "East Client"}),取指定语言的值有两种写法,效果相同:
|
写法 |
说明 |
|---|---|
|
|
下标语法,更简洁 |
|
|
函数写法,兼容性更好 |
推荐日常使用下标写法(更简短),如遇兼容问题可改用 json_get。
示例:查客户的编码与中文名称。
select Customer {
code,
name_zh := <str>.name['zh-cn']
}
等价写法:
select Customer {
code,
name_zh := <str>json_get(.name, 'zh-cn')
}
结果示意:
[
{ "code": "C001", "name_zh": "华东客户" }
]
|
运算/函数 |
说明 |
|---|---|
|
|
加减乘除、整除、取模、次幂 |
|
|
计数 |
|
|
去重计数 |
|
|
求和(int64/decimal) |
|
|
最小/最大值 |
|
|
平均值 |
小数运算时若类型不匹配,可按报错强转,如 <decimal>0.5。
示例:每个订单的订单行数量、订单行金额合计、以及平均行金额(总金额/行数,行数为 0 时为 0)。
select Order {
order_no,
order_date,
line_count := count(.<order[is OrderLine]),
total_amount := sum(.<order[is OrderLine].qty * .<order[is OrderLine].price),
avg_line_amount := .total_amount / .line_count if .line_count != 0 else 0
}
结果示意:
[
{
"order_no": "ORD001",
"order_date": "2023-10-01",
"line_count": 2,
"total_amount": 199.00,
"avg_line_amount": 99.50
}
]
|
写法/函数 |
说明 |
|---|---|
|
|
当前时间 |
|
|
加减时间间隔(day/week/month 等) |
|
|
取年/月/日等部分 |
|
|
取间隔的天数等 |
|
|
格式化为字符串 |
示例:当前时间减一天、格式化为「YYYY-MM-DD」。
select to_str(
cal::local_datetime_of_statement() - <cal::relative_duration>'1 day',
'YYYY-MM-DD'
)
结果示意:
"2023-10-09"
语法:左值 if 条件 else 右值。条件为 true 取左值,否则取右值。可嵌套。
示例:按订单状态得到展示用数字(用于排序或展示)。
select Order {
status,
status_sort := 1 if .status = 'draft' else 2 if .status = 'confirmed' else 3
}
语法:A ?? B。A 非空则为 A,否则为 B。用于给可能为空的表达式提供默认值。
示例:订单状态为空时显示为 ‘unknown’。
select Order {
status,
status_display := .status ?? 'unknown'
}
|
写法/函数 |
说明 |
|---|---|
|
|
将集合转为数组 |
|
|
用分隔符将数组元素拼成字符串 |
|
|
取第 i 个元素(从 0 起);越界时 array_get 返回空集 |
示例:每个订单的订单行商品名称用「、」拼接。
select Order {
order_no,
product_names := to_str(array_agg(.<order[is OrderLine].product_name), '、')
}
结果示意:
[
{ "order_no": "ORD001", "product_names": "商品A、商品B" }
]
DeepModel 属性与 DeepQL 类型对应(写字面量或传参时参考):
|
DeepModel 属性类型 |
DeepQL 类型 |
字面量示例 |
|---|---|---|
|
文本 |
str |
|
|
整数 |
int64 |
|
|
小数 |
decimal |
|
|
布尔 |
bool |
|
|
日期时间 |
cal::local_datetime |
|
|
枚举 |
str |
|
|
UUID |
uuid |
|
|
类别 |
常用 |
|---|---|
|
比较 |
|
|
文本 |
|
|
聚合 |
count、sum、min、max、mean |
|
日期 |
local_datetime_of_statement、relative_duration、to_str |
|
条件/空值 |
if…else、?? |
|
数组 |
array_agg、to_str 拼接 |
下一步可以学习层级与树形数据,见「八、层级与树形」。
回到顶部
咨询热线
