全部文档
文档中心数据流3.0语法建议SQL语法建议

SQL语法建议

数据流中的【SQL转换】节点、【数据转换】节点的【列计算】步骤、【连接器查询】和【数据表查询】节点的SQL模式等,都会涉及到SQL语言的编写,因此有必要对SQL语言有一些基础认识。

不同数据库中的SQL语法各有不同,此文档仅以DuckDB数据库为例。

【连接器查询】和【数据表查询】节点的SQL语法需要符合该节点选择的数据库类型,其他未指定明确数据库的节点,都使用DuckDB数据库的SQL进行数据库处理(例如【SQL转换】节点、【数据转换】节点的【列计算】步骤)。

如何在SQL框中引用数据流中的预置变量,详见预置变量章节:https://docs.deepfos.com/component/deeppipeline/function/variable#sql

添加【SQL转换】节点,运行SELECT version()可得到版本信息。



若您的环境部署了AI助手,在SQL框可直接使用AI助手来编写/分析/检查/重写SQL:



若未部署,也可自行使用AI工具进行查询,建议您在提示词中指明数据库类型和版本,以降低结果的错误率,以deepseek为例,其返回的list_sort(list_distinct(order_list))则是完全正确的语句。



内部成员可访问语雀文档:https://proinnova.yuque.com/ys1krd/sa4wgw/tbze6ubagdvgs395

外部用户可进入SQL代码框的全屏状态,会在左侧展示常用函数的解释和示例。

以下表格是仅供参考的部分函数,下面表格后续不会进行更新,请至语雀文档或系统中查看最新的完整表格。

示例

帮助说明

绝对值(abs)

返回绝对值,用函数别名@也有同样效果。


示例1:abs(-17.4)

结果1:17.4

示例2:@(-17.4)

结果2:17.4

四舍五入(round)

四舍五入保留s位小数。允许s为负数。


示例:round(42.4332, 2)

结果:42.43

行号(row_number)

为每行生成一个行号,支持分区和区内排序。


示例1(不分区的连续行号):row_number() OVER ()

示例2(按门店分区,区内按金额降序,连续行号):row_number() OVER (PARTITION BY Store ORDER BY Amount Desc)

示例

帮助说明

提取(extract)

提取日期字段中的年月日等组成部分,提取出的字段类型为整数。


常用的指定符号:年year,月month,日day,时hour,分minute,秒second,世纪century,季度quarter。

示例1:extract(‘year’ FROM DATE ‘1992-01-20’)

结果1:1992

示例2:extract(‘quarterr’ FROM DATE ‘1992-01-20’)

结果2:1

格式化(strftime)

将日期字段转换为指定格式的文本。常用的格式指定符号如下(注意大小写)。


年:%Y;

月:%m;

日:%d,固定两位数,左补0,例如01;

日:%-d,不固定位数,例如1;

时:%H,24小时制,固定两位数,左补0;

时:%I,12小时制,固定两位数,左补0;

分:%M,固定两位数,左补0;

秒:%S,固定两位数,左补0;


示例1:strftime(now(), ‘%Y-%m-%d %H:%M:%S’)

结果1:2026-02-11 18:44:17

示例2:strftime(today, ‘%a, %-d %B %Y’)

结果2:Wed, 11 February 2026

今天(today)

当前日期(本地时区),不带时分秒(时分秒都是0)。


示例1:today()

结果1:2022-10-08

月末(last_day)

返回指定日期所在月份的最后一天,结合天数计算,还可以轻松得出月初的日期。


示例1:last_day(today())

结果1:2026-02-28

天数计算(+/-)

用加减法进行日期间的天数计算。


示例1(5天后):today() + 5

结果1:2026-02-16

示例2(5天后):today() + INTERVAL 5 DAY

结果2:2026-02-16

示例3(5天前):today() - 5

结果3:2026-02-06

示例4(2个日期间隔了几天):DATE ‘1992-03-27’ - DATE ‘1992-03-22’

结果4:5

示例

帮助说明

现在(now)

当前时间,数据流中会转化为0时区进行显示。以下函数效果相同:current_timestamp, get_current_timestamp(), transaction_timestamp()。


示例1:now()

结果1:2026-02-11T11:22:02+00

示例2:current_timestamp

结果2:2026-02-11T11:22:02+00

示例3:get_current_timestamp()

结果3:2026-02-11T11:22:02+00

时间戳转换(to_timestamp)

将自1970-01-01以来的秒数转换为0时区的时间,若是毫秒数,需要先除以1000,或使用epoch_ms函数,该函数可用于毫秒和本地时间的互相转换。


示例1:to_timestamp(1284352323.5)

结果1:2010-09-13T04:32:03+00

示例2:epoch_ms(1767198163000)

结果2:2025-12-31T16:22:43

示例3:epoch_ms(now())

结果3:1767198163000

指定时区(AT TIME ZONE)

返回指定时区的时间戳。


时区的格式可以通过在【SQL转换】节点中执行这段语句进行查询,返回的name列为时区格式:SELECT * FROM pg_timezone_names();

示例1:now() AT TIME ZONE ‘Asia/Shanghai’

结果1:2026-02-11T19:42:53.710000

示例2:timezone(‘Asia/Shanghai’, now())

结果2:2026-02-11T19:42:53.710000

示例

帮助说明

空值替换(coalesce)

coalesce函数可接受任意数量的参数,并返回第一个非空的参数。若所有参数均为空值,coalesce同样返回空值。


示例1:coalesce(NULL, NULL, 1)

结果1:1

示例2:coalesce(10, 20)

结果2:10

示例3:coalesce(NULL, NULL)

结果3:NULL

空值替换(ifnull)

双参数版本的coalesce函数,返回第一个非空的参数。


示例1:ifnull(NULL, ‘default_string’)

结果1:default_string

示例2:ifnull(1, ‘default_string’)

结果2:1

判断为空(IS NULL)

判断是否为空,返回布尔值。


示例1(判断为空):NULL IS NULL

结果1:true

示例2(判断不为空):NULL IS NOT NULL

结果2:false

示例

帮助说明

长度(length)

返回列表的成员数量,NULL成员也会被统计数量,用函数len和array_length效果一样


示例1:length([1,2,3])

结果1:3

示例2:len([NULL,1,2,3,NULL])

结果2:5

示例3:array_length([NULL,1,2,3,NULL])

结果3:5

去重去空(list_distinct)

去除列表中的所有重复值和NULL值,去重后无法保留原顺序。


示例:list_distinct([1, 1, NULL, -3, 1, 5])

结果:[5, -3, 1]

去重去空计数(list_approx_count_distinct)

列表成员去重、去NULL后,统计数量。函数list_unique也有同样效果,但其不适用于大数据场景,结果更精准但极大影响效率。


示例:list_approx_count_distinct([NULL,1,2,3,3,NULL])

结果:3

转文本(list_string_agg)

将列表元素拼接为字符串,不去重,保留顺序。


示例:list_string_agg([3,3,9])

结果:3,3,9

成员排序(list_sort)

对列表中的元素进行排序。list_sort最多可接受两个额外的可选参数:第二个参数指定排序顺序,可选ASC(升序)或DESC(降序);第三个参数指定空值位置,可选NULLS FIRST(空值在前)或NULLS LAST(空值在后)。


示例1:list_sort([1, 3, NULL, 5, NULL, -5])

结果1:[NULL, NULL, -5, 1, 3, 5]

示例2:list_sort([1, 3, NULL, 2], ‘ASC’)

结果2:[NULL, 1, 2, 3]

示例3:list_sort([1, 3, NULL, 2], ‘DESC’, ‘NULLS FIRST’)

结果3:[NULL, 3, 2, 1]

示例4:list_reverse_sort([1, 3, NULL, 2], ‘NULLS LAST’)

结果4:[3, 2, 1, NULL]

示例5:list_reverse_sort([1, 3, NULL, 2], ‘NULLS LAST’)

结果5:[NULL, 3, 2, 1]

展平(flatten)

展平一层,不会递归展平所有层级,也不会去重去NULL。


示例1:flatten([ [1, 2], [3, 4] ])

结果1:[1, 2, 3, 4]

示例2:flatten([ [ [1, 2], [3, 4] ], [ [5, 6], [7, 8] ] ])

结果2:[ [1, 2], [3, 4], [5, 6], [7, 8] ]

解包(unnest)

将列表按一层层级展开为多行,这是一个会改变结果集行数的特殊函数。可通过max_depth参数限制递归展开的深度。解包空列表和NULL均会导致零行,如果您要解包的列可能为空列表或NULL,通常需要先进行处理,否则会导致返回的行数减少。


示例1:unnest([1, 2, 3])

结果1:3行:1, 2, 3

示例2:unnest([[[1, 2], [3, 4]], [[5, 6], [7, 8, 9], []], [[10, 11]]], max_depth := 2)

结果2:6行:[1,2] , [3,4] , [5,6] , [7,8,9], [], [10,11]

示例3:unnest([])

结果3:0行

示例4:unnest(NULL)

结果4:0行

筛选(filter)

从输入列表中筛选出使lambda函数返回true的元素构造为新列表。DuckDB必须能够将lambda函数的返回类型转换为BOOL类型。函数返回的类型与输入列表的类型相同。


示例1:filter([3, 4, 5], x -> x > 4)

结果1:[5]

示例2:filter([1, NULL, 3], x -> x IS NOT NULL)

结果2:[1, 3]

区间(range)

生成从start到stop范围内的值构成的列表。start参数包含在内,默认为0,stop参数不包含在内,允许指定增长的步长,默认为1。


示例1:range(5)

结果1:[0, 1, 2, 3, 4]

示例2:range(2, 5)

结果2:[2, 3, 4]

示例3:range(2, 8, 3)

结果3:[2,5]

示例

帮助说明

类型转换(CAST)

标准语法为:CAST(表达式 AS 类型名),还支持简写形式:表达式::类型名。


常用的类型名:文本VARCHAR,指定精度小数DECIMAL(总长度, 小数位数) ,整数INTEGER,布尔值BOOLEAN,日期DATE。

示例1:CAST(column AS VARCHAR)

示例2:column::DOUBLE

条件判断(CASE)

CASE表达式会执行满足的条件后对应的表达式,当仅有一个条件时,也可使用IF(cond, a, b)来表示当满足cond则输出a否则输出b。


示例1:CASE WHEN i > 2 THEN 1 ELSE 0 END

示例2:IF(i > 2, 1, 0)

示例3:CASE WHEN i = 1 THEN 10 WHEN i = 2 THEN 20 ELSE 0 END

根据版本信息,可访问DuckDB官网获得对应版本的语法帮助,以1.2版本为例,官网地址:https://duckdb.org/docs/1.2/sql/functions/overview



访问其中的具体章节,为您的具体问题提供更多建议。

例如想查找更多的日期格式指定符号:



回到顶部

咨询热线

400-821-9199

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

ctrl+Enter to send