全部文档
文档中心DeepModel功能DeepQL常用语法与使用技巧七、表达式与常用函数

七、表达式与常用函数

写 filter、select 中的计算字段时,会用到比较、文本、数字、日期、空值处理等表达式和函数。本节按用途分类列出常用写法。

操作符

说明

=!=

等于、不等于(操作数有空则结果为空集)

?=?!=

等于、不等于(可与空值比较)

<><=>=

小于、大于、小于等于、大于等于

与可选参数或可能为空的字段比较时,用 ?=?!=

写法

说明

x in 集合x not in 集合

判断 x 是否在集合中

exists 集合not exists 集合

判断集合是否非空

示例:统计状态为「草稿」或「已确认」的订单数。

Copy
select count(Order filter .status in {'draft', 'confirmed'})

结果示意:

Copy
5

写法/函数

说明

str ++ str

字符串拼接

str like patternstr not like pattern

大小写敏感匹配

str ilike patternstr not ilike pattern

大小写不敏感匹配

pattern 中 % 表示任意字符序列,_ 表示任意单字符。

函数

说明

len(str)

字符串长度

contains(haystack, needle)

是否包含子串

str_lower(str)str_upper(str)

转小写/大写

str_trim(str, trim?)

去掉首尾指定字符,默认空格

str_replace(s, old, new)

替换

str_split(s, delimiter)

按分隔符拆成数组

to_str(val, fmt?)

转为字符串(数值、日期等)

示例:订单号与状态用下划线拼接为描述。

Copy
select Order {
    order_no,
    status,
    desc := .order_no ++ '_' ++ .status
}

结果示意:

Copy
[
  { "order_no": "ORD001", "status": "draft", "desc": "ORD001_draft" }
]

多语言属性底层为 JSON(如 {"zh-cn": "华东客户", "en": "East Client"}),取指定语言的值有两种写法,效果相同:

写法

说明

<str>.name['zh-cn']

下标语法,更简洁

<str>json_get(.name, 'zh-cn')

函数写法,兼容性更好

推荐日常使用下标写法(更简短),如遇兼容问题可改用 json_get

示例:查客户的编码与中文名称。

Copy
select Customer {
    code,
    name_zh := <str>.name['zh-cn']
}

等价写法:

Copy
select Customer {
    code,
    name_zh := <str>json_get(.name, 'zh-cn')
}

结果示意:

Copy
[
  { "code": "C001", "name_zh": "华东客户" }
]

运算/函数

说明

+-*///%^

加减乘除、整除、取模、次幂

count(集合)

计数

count(distinct 集合)

去重计数

sum(集合)

求和(int64/decimal)

min(集合)max(集合)

最小/最大值

math::mean(集合)

平均值

小数运算时若类型不匹配,可按报错强转,如 <decimal>0.5

示例:每个订单的订单行数量、订单行金额合计、以及平均行金额(总金额/行数,行数为 0 时为 0)。

Copy
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
}

结果示意:

Copy
[
  {
    "order_no": "ORD001",
    "order_date": "2023-10-01",
    "line_count": 2,
    "total_amount": 199.00,
    "avg_line_amount": 99.50
  }
]

写法/函数

说明

cal::local_datetime_of_statement()

当前时间

日期 + <cal::relative_duration>'1 day'

加减时间间隔(day/week/month 等)

datetime_get(日期, 'year'/'month'/'day'/...)

取年/月/日等部分

duration_get(间隔, 'day')

取间隔的天数等

to_str(日期, 'YYYY-MM-DD')

格式化为字符串

示例:当前时间减一天、格式化为「YYYY-MM-DD」。

Copy
select to_str(
    cal::local_datetime_of_statement() - <cal::relative_duration>'1 day',
    'YYYY-MM-DD'
)

结果示意:

Copy
"2023-10-09"

语法:左值 if 条件 else 右值。条件为 true 取左值,否则取右值。可嵌套。

示例:按订单状态得到展示用数字(用于排序或展示)。

Copy
select Order {
    status,
    status_sort := 1 if .status = 'draft' else 2 if .status = 'confirmed' else 3
}

语法:A ?? B。A 非空则为 A,否则为 B。用于给可能为空的表达式提供默认值。

示例:订单状态为空时显示为 ‘unknown’。

Copy
select Order {
    status,
    status_display := .status ?? 'unknown'
}

写法/函数

说明

array_agg(集合)

将集合转为数组

to_str(数组, '分隔符')

用分隔符将数组元素拼成字符串

array[i]array_get(array, i)

取第 i 个元素(从 0 起);越界时 array_get 返回空集

示例:每个订单的订单行商品名称用「、」拼接。

Copy
select Order {
    order_no,
    product_names := to_str(array_agg(.<order[is OrderLine].product_name), '、')
}

结果示意:

Copy
[
  { "order_no": "ORD001", "product_names": "商品A、商品B" }
]

DeepModel 属性与 DeepQL 类型对应(写字面量或传参时参考):

DeepModel 属性类型

DeepQL 类型

字面量示例

文本

str

'abc'"abc"

整数

int64

123

小数

decimal

1.23,计算时或需 <decimal>1.23

布尔

bool

truefalse

日期时间

cal::local_datetime

<cal::local_datetime>'2023-10-01 12:00:00'

枚举

str

'approved'

UUID

uuid

<uuid>'...'

类别

常用

比较

=?=inexists

文本

++、like/ilike、str_*、.name['zh-cn']json_get 多语言

聚合

count、sum、min、max、mean

日期

local_datetime_of_statement、relative_duration、to_str

条件/空值

if…else、??

数组

array_agg、to_str 拼接

下一步可以学习层级与树形数据,见「八、层级与树形」。

回到顶部

咨询热线

400-821-9199

我们使用 ChatGPT,基于文档中心的内容以及对话上下文回答您的问题。

ctrl+Enter to send