⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
列表函数
名称 描述
list[index] 方括号表示法是 list_extract 的别名。
list[begin:end] 带冒号的方括号表示法是 list_slice 的别名。
list[begin:end:step] step 参数的方括号表示法 list_slice
array_pop_back(list) 返回移除了最后一个元素的列表。
array_pop_front(list) 返回移除了第一个元素的列表。
flatten(list_of_lists) 将列表的列表连接成单个列表。这只平展列表的一个级别(参见示例)。
len(list) 返回列表的长度。
list_aggregate(list, name) list 的元素执行聚合函数 name。有关更多详细信息,请参阅列表聚合部分。
list_any_value(list) 返回列表中第一个非空值。
list_append(list, element) element 追加到 list
list_concat(list1, ..., listn) 连接列表。NULL 输入会被跳过。另请参阅 ||
list_contains(list, element) 如果列表包含该元素,则返回 true。
list_cosine_similarity(list1, list2) 计算两个列表之间的余弦相似度。
list_cosine_distance(list1, list2) 计算两个列表之间的余弦距离。等同于 1.0 - list_cosine_similarity
list_distance(list1, list2) 计算两个等长输入列表中给定坐标的两个点之间的欧几里得距离。
list_distinct(list) 从列表中移除所有重复项和 NULL 值。不保留原始顺序。
list_dot_product(list1, list2) 计算两个大小相同数字列表的点积。
list_negative_dot_product(list1, list2) 计算两个大小相同数字列表的负点积。等同于 - list_dot_product
list_extract(list, index) 从列表中提取第 index 个(基于 1)值。
list_filter(list, lambda) 从输入列表中 lambda 函数返回 true 的元素构造一个列表。有关更多详细信息,请参阅Lambda 函数页面。
list_grade_up(list) 功能类似于排序,但结果是与原始 list 中的位置对应的索引,而不是实际值。
list_has_all(list, sub-list) 如果子列表的所有元素都存在于列表中,则返回 true。
list_has_any(list1, list2) 如果任何元素存在于两个列表中,则返回 true。
list_intersect(list1, list2) 返回一个包含 l1l2 中所有共同元素的列表,无重复项。
list_position(list, element) 如果列表包含该元素,则返回该元素的索引。如果未找到该元素,则返回 NULL
list_prepend(element, list) element 前置到 list
list_reduce(list, lambda) 返回一个单一值,它是将 lambda 函数应用于输入列表的每个元素的结果。有关更多详细信息,请参阅Lambda 函数页面。
list_resize(list, size[, value]) 调整列表大小以包含 size 个元素。如果未设置 value,则使用 valueNULL 初始化新元素。
list_reverse_sort(list) 以逆序对列表元素进行排序。有关 NULL 排序顺序的更多详细信息,请参阅列表排序部分。
list_reverse(list) 反转列表。
list_select(value_list, index_list) 根据 index_list 选择的元素返回一个列表。
list_slice(list, begin, end, step) 带有 step 功能的 list_slice
list_slice(list, begin, end) 使用切片约定提取子列表。接受负值。参见切片
list_sort(list) 对列表元素进行排序。有关排序顺序和 NULL 排序顺序的更多详细信息,请参阅列表排序部分。
list_transform(list, lambda) 返回一个列表,它是将 lambda 函数应用于输入列表的每个元素的结果。有关更多详细信息,请参阅Lambda 函数页面。
list_unique(list) 计算列表中唯一元素的数量。
list_value(any, ...) 创建一个包含参数值的 LIST
list_where(value_list, mask_list) 返回一个列表,其中 mask_list 中的 BOOLEAN 值作为掩码应用于 value_list
list_zip(list_1, list_2, ...[, truncate]) 将 *k* 个 LIST 压缩为一个新 LIST,新列表的长度将是所有输入列表中最长的。其元素是来自每个列表 list_1, …, list_k 的 *k* 个元素的结构体,缺失的元素用 NULL 替换。如果设置了 truncate,所有列表将被截断为最短列表的长度。
repeat(list, count) 重复 list count 次。
unnest(list) 将列表解除嵌套一层。请注意,这是一个特殊函数,会改变结果的基数。有关更多详细信息,请参阅unnest 页面

list[index]

描述 方括号表示法是 list_extract 的别名。
示例 [4, 5, 6][3]
结果 6
别名 list_extract

list[begin:end]

描述 带冒号的方括号表示法是 list_slice 的别名。
示例 [4, 5, 6][2:3]
结果 [5, 6]
别名 list_slice

list[begin:end:step]

描述 step 参数的方括号表示法 list_slice
示例 [4, 5, 6][:-:2]
结果 [4, 6]
别名 list_slice

array_pop_back(list)

描述 返回移除了最后一个元素的列表。
示例 array_pop_back([4, 5, 6])
结果 [4, 5]

array_pop_front(list)

描述 返回移除了第一个元素的列表。
示例 array_pop_front([4, 5, 6])
结果 [5, 6]

flatten(list_of_lists)

描述 将列表的列表连接成单个列表。这只平展列表的一个级别(参见示例)。
示例 flatten([[1, 2], [3, 4]])
结果 [1, 2, 3, 4]

len(list)

描述 返回列表的长度。
示例 len([1, 2, 3])
结果 3
别名 array_length

list_aggregate(list, name)

描述 list 的元素执行聚合函数 name。有关更多详细信息,请参阅列表聚合部分。
示例 list_aggregate([1, 2, NULL], 'min')
结果 1
别名 list_aggr, aggregate, array_aggregate, array_aggr

list_any_value(list)

描述 返回列表中第一个非空值。
示例 list_any_value([NULL, -3])
结果 -3

list_append(list, element)

描述 element 追加到 list
示例 list_append([2, 3], 4)
结果 [2, 3, 4]
别名 array_append, array_push_back

list_concat(list1, ..., listn)

描述 连接列表。NULL 输入会被跳过。另请参阅 ||
示例 list_concat([2, 3], [4, 5, 6], [7])
结果 [2, 3, 4, 5, 6, 7]
别名 list_cat, array_concat, array_cat

list_contains(list, element)

描述 如果列表包含该元素,则返回 true。
示例 list_contains([1, 2, NULL], 1)
结果 true
别名 list_has, array_contains, array_has

list_cosine_similarity(list1, list2)

描述 计算两个列表之间的余弦相似度。
示例 list_cosine_similarity([1, 2, 3], [1, 2, 5])
结果 0.9759000729485332

list_cosine_distance(list1, list2)

描述 计算两个列表之间的余弦距离。等同于 1.0 - list_cosine_similarity
示例 list_cosine_distance([1, 2, 3], [1, 2, 5])
结果 0.024099927051466796

list_distance(list1, list2)

描述 计算两个等长输入列表中给定坐标的两个点之间的欧几里得距离。
示例 list_distance([1, 2, 3], [1, 2, 5])
结果 2.0

list_distinct(list)

描述 从列表中移除所有重复项和 NULL 值。不保留原始顺序。
示例 list_distinct([1, 1, NULL, -3, 1, 5])
结果 [1, 5, -3]
别名 array_distinct

list_dot_product(list1, list2)

描述 计算两个大小相同数字列表的点积。
示例 list_dot_product([1, 2, 3], [1, 2, 5])
结果 20.0
别名 list_inner_product

list_negative_dot_product(list1, list2)

描述 计算两个大小相同数字列表的负点积。等同于 - list_dot_product
示例 list_negative_dot_product([1, 2, 3], [1, 2, 5])
结果 -20.0
别名 list_negative_inner_product

list_extract(list, index)

描述 从列表中提取第 index 个(基于 1)值。
示例 list_extract([4, 5, 6], 3)
结果 6
别名 list_element, array_extract

list_filter(list, lambda)

描述 从输入列表中 lambda 函数返回 true 的元素构造一个列表。有关更多详细信息,请参阅Lambda 函数页面。
示例 list_filter([4, 5, 6], x -> x > 4)
结果 [5, 6]
别名 array_filter, filter

list_grade_up(list)

描述 功能类似于排序,但结果是与原始 list 中的位置对应的索引,而不是实际值。
示例 list_grade_up([30, 10, 40, 20])
结果 [2, 4, 1, 3]
别名 array_grade_up

list_has_all(list, sub-list)

描述 如果子列表的所有元素都存在于列表中,则返回 true。
示例 list_has_all([4, 5, 6], [4, 6])
结果 true
别名 array_has_all

list_has_any(list1, list2)

描述 如果任何元素存在于两个列表中,则返回 true。
示例 list_has_any([1, 2, 3], [2, 3, 4])
结果 true
别名 array_has_any

list_intersect(list1, list2)

描述 返回一个包含 l1l2 中所有共同元素的列表,无重复项。
示例 list_intersect([1, 2, 3], [2, 3, 4])
结果 [2, 3]
别名 array_intersect

list_position(list, element)

描述 如果列表包含该元素,则返回该元素的索引。如果未找到该元素,则返回 NULL
示例 list_position([1, 2, NULL], 2)
结果 2
别名 list_indexof, array_position, array_indexof

list_prepend(element, list)

描述 element 前置到 list
示例 list_prepend(3, [4, 5, 6])
结果 [3, 4, 5, 6]
别名 array_prepend, array_push_front

list_reduce(list, lambda)

描述 返回一个单一值,它是将 lambda 函数应用于输入列表的每个元素的结果。有关更多详细信息,请参阅Lambda 函数页面。
示例 list_reduce([4, 5, 6], (acc, x) -> acc + x)
结果 15
别名 array_reduce, reduce

list_resize(list, size[, value])

描述 调整列表大小以包含 size 个元素。如果未设置 value,则使用 valueNULL 初始化新元素。
示例 list_resize([1, 2, 3], 5, 0)
结果 [1, 2, 3, 0, 0]
别名 array_resize

list_reverse_sort(list)

描述 以逆序对列表元素进行排序。有关 NULL 排序顺序的更多详细信息,请参阅列表排序部分。
示例 list_reverse_sort([3, 6, 1, 2])
结果 [6, 3, 2, 1]
别名 array_reverse_sort

list_reverse(list)

描述 反转列表。
示例 list_reverse([3, 6, 1, 2])
结果 [2, 1, 6, 3]
别名 array_reverse

list_select(value_list, index_list)

描述 根据 index_list 选择的元素返回一个列表。
示例 list_select([10, 20, 30, 40], [1, 4])
结果 [10, 40]
别名 array_select

list_slice(list, begin, end, step)

描述 带有 step 功能的 list_slice
示例 list_slice([4, 5, 6], 1, 3, 2)
结果 [4, 6]
别名 array_slice

list_slice(list, begin, end)

描述 使用切片约定提取子列表。接受负值。参见切片
示例 list_slice([4, 5, 6], 2, 3)
结果 [5, 6]
别名 array_slice

list_sort(list)

描述 对列表元素进行排序。有关排序顺序和 NULL 排序顺序的更多详细信息,请参阅列表排序部分。
示例 list_sort([3, 6, 1, 2])
结果 [1, 2, 3, 6]
别名 array_sort

list_transform(list, lambda)

描述 返回一个列表,它是将 lambda 函数应用于输入列表的每个元素的结果。有关更多详细信息,请参阅Lambda 函数页面。
示例 list_transform([4, 5, 6], x -> x + 1)
结果 [5, 6, 7]
别名 array_transform, apply, list_apply, array_apply

list_unique(list)

描述 计算列表中唯一元素的数量。
示例 list_unique([1, 1, NULL, -3, 1, 5])
结果 3
别名 array_unique

list_value(any, ...)

描述 创建一个包含参数值的 LIST
示例 list_value(4, 5, 6)
结果 [4, 5, 6]
别名 list_pack

list_where(value_list, mask_list)

描述 返回一个列表,其中 mask_list 中的 BOOLEAN 值作为掩码应用于 value_list
示例 list_where([10, 20, 30, 40], [true, false, false, true])
结果 [10, 40]
别名 array_where

list_zip(list1, list2, ...)

描述 将 *k* 个 LIST 压缩为一个新 LIST,新列表的长度将是所有输入列表中最长的。其元素是来自每个列表 list_1, …, list_k 的 *k* 个元素的结构体,缺失的元素用 NULL 替换。如果设置了 truncate,所有列表将被截断为最短列表的长度。
示例 list_zip([1, 2], [3, 4], [5, 6])
结果 [(1, 3, 5), (2, 4, 6)]
别名 array_zip

repeat(list, count)

描述 重复 list count 次。
示例 repeat([1, 2], 5)
结果 [1, 2, 1, 2, 1, 2, 1, 2, 1, 2]

unnest(list)

描述 将列表解除嵌套一层。请注意,这是一个特殊函数,会改变结果的基数。有关更多详细信息,请参阅unnest 页面
示例 unnest([1, 2, 3])
结果 1, 2, 3

列表运算符

列表支持以下运算符

运算符 描述 示例 结果
&& list_has_any 的别名。 [1, 2, 3, 4, 5] && [2, 5, 5, 6] true
@> list_has_all 的别名,其中运算符**右侧**的列表是子列表。 [1, 2, 3, 4] @> [3, 4, 3] true
<@ list_has_all 的别名,其中运算符**左侧**的列表是子列表。 [1, 4] <@ [1, 2, 3, 4] true
|| 类似于 list_concat,但任何 NULL 输入都将导致 NULL 结果。 [1, 2, 3] || [4, 5, 6] [1, 2, 3, 4, 5, 6]
<=> list_cosine_distance 的别名。 [1, 2, 3] <=> [1, 2, 5] 0.007416606
<-> list_distance 的别名。 [1, 2, 3] <-> [1, 2, 5] 2.0

列表推导式

Python 风格的列表推导式可用于计算列表中元素的表达式。例如

SELECT [lower(x) FOR x IN strings] AS strings
FROM (VALUES (['Hello', '', 'World'])) t(strings);
字符串
[hello, , world]
SELECT [upper(x) FOR x IN strings IF len(x) > 0] AS strings
FROM (VALUES (['Hello', '', 'World'])) t(strings);
字符串
[HELLO, WORLD]

列表推导式还可以通过添加第二个变量来使用列表元素的位置。在以下示例中,我们使用 x, i,其中 x 是值,i 是位置

SELECT [4, 5, 6] AS l, [x FOR x, i IN l IF i != 2] AS filtered;
l 过滤后的
[4, 5, 6] [4, 6]

在底层,[f(x) FOR x IN y IF g(x)] 被转换为 list_transform(list_filter(y, x -> f(x)), x -> f(x))

范围函数

DuckDB 提供了两个范围函数,range(start, stop, step)generate_series(start, stop, step),以及它们带有 stopstep 默认参数的变体。这两个函数在 stop 参数方面的行为不同。详细说明如下。

range

函数 rangestartstop 之间创建一系列值。start 参数是包含的,而 stop 参数是排他的。start 的默认值为 0,step 的默认值为 1。

根据参数的数量,range 存在以下变体。

range(stop)

SELECT range(5);
[0, 1, 2, 3, 4]

range(start, stop)

SELECT range(2, 5);
[2, 3, 4]

range(start, stop, step)

SELECT range(2, 5, 3);
[2]

generate_series

函数 generate_seriesstartstop 之间创建一系列值。startstop 参数都是包含的。start 的默认值为 0,step 的默认值为 1。根据参数的数量,generate_series 存在以下变体。

generate_series(stop)

SELECT generate_series(5);
[0, 1, 2, 3, 4, 5]

generate_series(start, stop)

SELECT generate_series(2, 5);
[2, 3, 4, 5]

generate_series(start, stop, step)

SELECT generate_series(2, 5, 3);
[2, 5]

generate_subscripts(arr, dim)

函数 generate_subscripts(arr, dim) 沿着数组 arr 的第 dim 维度生成索引。

SELECT generate_subscripts([4, 5, 6], 1) AS i;
i
1
2
3

日期范围

TIMESTAMPTIMESTAMP WITH TIME ZONE 值也支持日期范围。请注意,对于这些类型,stopstep 参数必须明确指定(不提供默认值)。

日期范围的 range 函数

SELECT *
FROM range(DATE '1992-01-01', DATE '1992-03-01', INTERVAL '1' MONTH);
range
1992-01-01 00:00:00
1992-02-01 00:00:00

日期范围的 generate_series 函数

SELECT *
FROM generate_series(DATE '1992-01-01', DATE '1992-03-01', INTERVAL '1' MONTH);
generate_series
1992-01-01 00:00:00
1992-02-01 00:00:00
1992-03-01 00:00:00

切片

函数 list_slice 可用于从列表中提取子列表。存在以下变体

  • list_slice(list, begin, end)
  • list_slice(list, begin, end, step)
  • array_slice(list, begin, end)
  • array_slice(list, begin, end, step)
  • list[begin:end]
  • list[begin:end:step]

参数如下

  • list
    • 要切片的列表
  • begin
    • 要包含在切片中的第一个元素的索引
    • begin < 0 时,索引从列表末尾开始计数
    • begin < 0-begin > length 时,begin 被限制为列表的开头
    • begin > length 时,结果为空列表
    • 方括号表示法:begin 省略时,默认为列表开头
  • end
    • 要包含在切片中的最后一个元素的索引
    • end < 0 时,索引从列表末尾开始计数
    • end > length 时,end 被限制为 length
    • end < begin 时,结果为空列表
    • 方括号表示法:end 省略时,默认为列表末尾。当 end 省略且提供了 step 时,end 必须替换为 -
  • step (可选)
    • 切片中元素之间的步长
    • step < 0 时,切片将被反转,并且 beginend 将互换
    • 必须为非零

示例

SELECT list_slice([1, 2, 3, 4, 5], 2, 4);
[2, 3, 4]
SELECT ([1, 2, 3, 4, 5])[2:4:2];
[2, 4]
SELECT([1, 2, 3, 4, 5])[4:2:-2];
[4, 2]
SELECT ([1, 2, 3, 4, 5])[:];
[1, 2, 3, 4, 5]
SELECT ([1, 2, 3, 4, 5])[:-:2];
[1, 3, 5]
SELECT ([1, 2, 3, 4, 5])[:-:-2];
[5, 3, 1]

列表聚合

函数 list_aggregate 允许对列表元素执行任意现有聚合函数。它的第一个参数是列表(列),第二个参数是聚合函数名称,例如 minhistogramsum

list_aggregate 在聚合函数名称之后接受额外的参数。这些额外参数直接传递给聚合函数,聚合函数作为 list_aggregate 的第二个参数。

SELECT list_aggregate([1, 2, -4, NULL], 'min');
-4
SELECT list_aggregate([2, 4, 8, 42], 'sum');
56
SELECT list_aggregate([[1, 2], [NULL], [2, 10, 3]], 'last');
[2, 10, 3]
SELECT list_aggregate([2, 4, 8, 42], 'string_agg', '|');
2|4|8|42

list_* 重写函数

以下是现有重写函数的列表。重写函数通过仅将列表(列)作为其参数来简化列表聚合函数的使用。list_avglist_var_samplist_var_poplist_stddev_poplist_stddev_samplist_semlist_approx_count_distinctlist_bit_xorlist_bit_orlist_bit_andlist_bool_andlist_bool_orlist_countlist_entropylist_lastlist_firstlist_kurtosislist_kurtosis_poplist_minlist_maxlist_productlist_skewnesslist_sumlist_string_agglist_modelist_medianlist_madlist_histogram

SELECT list_min([1, 2, -4, NULL]);
-4
SELECT list_sum([2, 4, 8, 42]);
56
SELECT list_last([[1, 2], [NULL], [2, 10, 3]]);
[2, 10, 3]

array_to_string

使用可选的分隔符连接列表/数组元素。

SELECT array_to_string([1, 2, 3], '-') AS str;
1-2-3

这等同于以下 SQL

SELECT list_aggr([1, 2, 3], 'string_agg', '-') AS str;
1-2-3

列表排序

函数 list_sort 以升序或降序对列表元素进行排序。此外,它允许指定 NULL 值应移至列表开头还是末尾。它与 DuckDB 的 ORDER BY 子句具有相同的排序行为。因此,list_sort 中的(嵌套)值与 ORDER BY 中的比较结果相同。

默认情况下,如果没有提供修饰符,DuckDB 会按 ASC NULLS FIRST 排序。即,值按升序排序,并且 NULL 值排在前面。这与 SQLite 的默认排序顺序相同。默认排序顺序可以使用 PRAGMA 语句更改。

list_sort 允许用户选择使用默认排序顺序还是自定义顺序。list_sort 最多接受两个额外的可选参数。第二个参数提供排序顺序,可以是 ASCDESC。第三个参数提供 NULL 顺序,可以是 NULLS FIRSTNULLS LAST

此查询使用默认排序顺序和默认 NULL 顺序。

SELECT list_sort([1, 3, NULL, 5, NULL, -5]);
[NULL, NULL, -5, 1, 3, 5]

此查询提供排序顺序。NULL 顺序使用可配置的默认值。

SELECT list_sort([1, 3, NULL, 2], 'ASC');
[NULL, 1, 2, 3]

此查询同时提供排序顺序和 NULL 顺序。

SELECT list_sort([1, 3, NULL, 2], 'DESC', 'NULLS FIRST');
[NULL, 3, 2, 1]

list_reverse_sort 有一个可选的第二个参数,用于提供 NULL 排序顺序。它可以是 NULLS FIRSTNULLS LAST

此查询使用默认 NULL 排序顺序。

SELECT list_sort([1, 3, NULL, 5, NULL, -5]);
[NULL, NULL, -5, 1, 3, 5]

此查询提供 NULL 排序顺序。

SELECT list_reverse_sort([1, 3, NULL, 2], 'NULLS LAST');
[3, 2, 1, NULL]

平展

flatten 函数是一个标量函数,它通过连接每个子列表将列表的列表转换为单个列表。请注意,这只是一次平展一个级别,而不是所有级别的子列表。

将列表的列表转换为单个列表

SELECT
    flatten([
        [1, 2],
        [3, 4]
    ]);
[1, 2, 3, 4]

如果列表有多个级别的列表,则只有第一级的子列表会被连接成单个列表

SELECT
    flatten([
        [
            [1, 2],
            [3, 4],
        ],
        [
            [5, 6],
            [7, 8],
        ]
    ]);
[[1, 2], [3, 4], [5, 6], [7, 8]]

通常,flatten 函数的输入应该是列表的列表(而不是单层列表)。但是,flatten 函数在处理空列表和 NULL 值时有特定的行为。

如果输入列表为空,则返回空列表

SELECT flatten([]);
[]

如果 flatten 的整个输入为 NULL,则返回 NULL

SELECT flatten(NULL);
NULL

如果一个唯一条目为 NULL 的列表被平展,则返回一个空列表

SELECT flatten([NULL]);
[]

如果列表的列表中的子列表只包含 NULL,则不修改该子列表

-- (Note the extra set of parentheses vs. the prior example)
SELECT flatten([[NULL]]);
[NULL]

即使每个子列表的唯一内容是 NULL,仍将其连接在一起。请注意,平展时不会进行去重。有关去重,请参见 list_distinct 函数

SELECT flatten([[NULL], [NULL]]);
[NULL, NULL]

Lambda 函数

DuckDB 支持 (parameter1, parameter2, ...) -> expression 形式的 lambda 函数。有关详细信息,请参见lambda 函数页面

  • 聚合函数 listhistogram 产生列表和结构体列表。
  • unnest 函数用于将列表解除嵌套一层。