全部文档
文档中心数据流3.0语法建议SQL语法建议(AI优化版)

SQL语法建议(AI优化版)

本篇文档面向在数据流中编写 SQL 的同学,帮助你:

  • 了解不同节点背后的数据库类型(尤其是 DuckDB)

  • 正确引用预置变量、确认 DuckDB 版本

  • 借助 AI 辅助编写/检查 SQL

  • 快速查阅常用 SQL 函数和语法

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

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

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

如何在 SQL 框中引用数据流中的预置变量,详见预置变量章节:

https://docs.deepfos.com/component/deeppipeline/function/variable#sql

在数据流中添加【SQL转换】节点,运行以下语句可得到 DuckDB 版本信息:

Copy
SELECT version();

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

若未部署 AI 助手,也可自行使用外部 AI 工具进行查询。建议在提示词中指明数据库类型和版本,以降低结果的错误率。

例如以 deepseek 为例,其返回的语句:

Copy
list_sort(list_distinct(order_list))

是完全正确的写法。

以下内容仅为部分常用函数的速查表,后续不会在此表中持续更新,请以语雀文档或系统内展示为准。

示例 帮助说明
拼接 (||) 连接多个字符串或列表,若任一参与拼接的值为 NULL,结果为 NULL
示例 1:'Duck' || 'DB'
结果:DuckDB
示例 2:[1, 2, 3] || [4, 5, 6]
结果:[1, 2, 3, 4, 5, 6]
示例 3:[1, 2, 3] || [4, 5, 6] || NULL
结果:NULL
拼接 (concat) 连接多个字符串或列表,若 NULL 直接作为参数参与拼接,则会被忽略;若 NULL 是列表中的成员,则保留。
示例 1:concat('Hello', ' ', 'World')
结果:Hello World
示例 2:concat([1, 2, 3], NULL, [4, 5, 6])
结果:[1, 2, 3, 4, 5, 6]
示例 3:concat([2, 3], [4, NULL, 5, 6], [7], [2, NULL])
结果:[2, 3, 4, NULL, 5, 6, 7, 2, NULL]
拆分 (split) 将字符串按分隔符拆分为列表。函数别名包括:string_splitstr_splitstring_to_array,效果相同。
示例:split('hello-world', '-')
结果:[hello, world]

示例

帮助说明

绝对值(abs

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


示例 1abs(-17.4)

结果:17.4

示例 2@(-17.4)

结果: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

示例 1extract('year' FROM DATE '1992-01-20')

结果:1992

示例 2extract('quarter' FROM DATE '1992-01-20')

结果: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')

结果:类似 2026-02-11 18:44:17

示例 2

strftime(today, '%a, %-d %B %Y')

结果:类似 Wed, 11 February 2026

今天(today

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


示例today()

结果:例如 2022-10-08

月末(last_day

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


示例last_day(today())

结果:例如 2026-02-28

天数计算(+ / -

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


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

结果:2026-02-16

示例 2(5 天后,使用 INTERVAL)today() + INTERVAL 5 DAY

结果:2026-02-16

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

结果:2026-02-06

示例 4(两个日期间相隔的天数)DATE '1992-03-27' - DATE '1992-03-22'

结果:5

示例

帮助说明

现在(now

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


示例 1now()

结果:类似 2026-02-11T11:22:02+00

示例 2current_timestamp

结果:类似 2026-02-11T11:22:02+00

示例 3get_current_timestamp()

结果:类似 2026-02-11T11:22:02+00

时间戳转换(to_timestamp

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


示例 1to_timestamp(1284352323.5)

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

示例 2epoch_ms(1767198163000)

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

示例 3epoch_ms(now())

结果:例如 1767198163000

指定时区(AT TIME ZONE / timezone

返回指定时区的时间戳。


可通过在【SQL转换】节点中执行下面语句查看可用时区格式(name 列):

SELECT * FROM pg_timezone_names();

示例 1now() AT TIME ZONE 'Asia/Shanghai'

结果:例如 2026-02-11T19:42:53.710000

示例 2timezone('Asia/Shanghai', now())

结果:例如 2026-02-11T19:42:53.710000

示例

帮助说明

空值替换(coalesce

接受任意数量参数,返回第一个非空(非 NULL)的参数。若所有参数均为空值,则返回 NULL


示例 1coalesce(NULL, NULL, 1)

结果:1

示例 2coalesce(10, 20)

结果:10

示例 3coalesce(NULL, NULL)

结果:NULL

空值替换(ifnull

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


示例 1ifnull(NULL, 'default_string')

结果:default_string

示例 2ifnull(1, 'default_string')

结果:1

判断为空(IS NULL

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


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

结果:true

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

结果:false

示例

帮助说明

长度(length / len / array_length

返回列表的成员数量,NULL 成员也会被统计。


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

结果:3

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

结果:5

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

结果:5

去重去空(list_distinct

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


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

结果:[5, -3, 1]

去重去空计数(list_approx_count_distinct / list_unique

列表成员去重、去 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_reverse_sort

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


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

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

示例 2list_sort([1, 3, NULL, 2], 'ASC')

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

示例 3list_sort([1, 3, NULL, 2], 'DESC', 'NULLS FIRST')

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

示例 4list_reverse_sort([1, 3, NULL, 2], 'NULLS LAST')

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

展平(flatten

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


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

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

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

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

解包(unnest

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


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

结果:3 行:123

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

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

示例 3unnest([])

结果:0 行

示例 4unnest(NULL)

结果:0 行

筛选(filter

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


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

结果:[5]

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

结果:[1, 3]

区间(range

生成从 startstop 范围内的值构成的列表,start 包含在内(默认 0),stop 不包含在内。可指定步长(默认 1)。


示例 1range(5)

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

示例 2range(2, 5)

结果:[2, 3, 4]

示例 3range(2, 8, 3)

结果:[2, 5]

示例

帮助说明

类型转换(CAST

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


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

示例 1CAST(column AS VARCHAR)

示例 2column::DOUBLE

条件判断(CASE / IF

CASE 表达式会在满足条件时执行对应分支,当仅有一个条件时,可用 IF(cond, a, b) 表示“满足 cond 则输出 a,否则输出 b”。


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

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

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

根据版本信息,可访问 DuckDB 官网获得对应版本的语法帮助。以 1.2 版本为例:

DuckDB 1.2 版本函数总览文档:


DuckDB 1.2 SQL Functions Overview

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

例如想查找更多日期格式指定符号,可进入日期时间相关章节:

回到顶部

咨询热线

400-821-9199

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

ctrl+Enter to send