⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
List Functions
Name Description
list[index] 括号表示法作为 list_extract 的别名。
list[begin:end] 带有冒号的括号表示法是 list_slice 的别名。
list[begin:end:step] list_slice 在括号表示法中增加了 step 功能。
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, list2) 连接两个列表。跳过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 Functions页面。
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) list_slice 增加了 step 功能。
list_slice(list, begin, end) 使用切片约定提取子列表。接受负值。参见切片
list_sort(list) 对列表中的元素进行排序。有关排序顺序和NULL排序顺序的更多详细信息,请参阅排序列表部分。
list_transform(list, lambda) 返回一个列表,该列表是将lambda函数应用于输入列表的每个元素的结果。有关更多详细信息,请参阅Lambda Functions页面。
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]) kLIST压缩成一个新的LIST,其长度将是最长列表的长度。其元素是来自每个列表list_1, …, list_kk个元素的结构体,缺失的元素将被替换为NULL。如果设置了truncate,则所有列表将被截断为最小列表长度。
unnest(list) 将列表展开一层。请注意,这是一个特殊函数,会改变结果的行数。更多详情请参见unnest页面

list[index]

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

list[begin:end]

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

list[begin:end:step]

描述 在括号表示法中使用list_slice,并添加了step功能。
示例 [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])
Result [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')
Result 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, list2)

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

list_contains(list, element)

描述 如果列表包含该元素,则返回 true。
示例 list_contains([1, 2, NULL], 1)
Result 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])
Result 0.007416606

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])
Result 20.0
别名 list_inner_product

list_negative_dot_product(list1, list2)

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

list_extract(list, index)

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

list_filter(list, lambda)

描述 从输入列表中构造一个列表,该列表包含lambda函数返回true的元素。有关更多详细信息,请参阅Lambda Functions页面。
Example list_filter([4, 5, 6], x -> x > 4)
Result [5, 6]
Aliases 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])
Result true
别名 array_has_all

list_has_any(list1, list2)

描述 如果两个列表中存在任何相同的元素,则返回true。
示例 list_has_any([1, 2, 3], [2, 3, 4])
Result 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)
Result 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 Functions页面。
Example list_reduce([4, 5, 6], (x, y) -> x + y)
Result 15
Aliases 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)

描述 list_slice 增加了 step 功能。
示例 list_slice([4, 5, 6], 1, 3, 2)
Result [4, 6]
别名 array_slice

list_slice(list, begin, end)

描述 使用切片约定提取子列表。接受负值。参见切片
示例 list_slice([4, 5, 6], 2, 3)
Result [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 Functions页面。
Example list_transform([4, 5, 6], x -> x + 1)
Result [5, 6, 7]
Aliases array_transform, apply, list_apply, array_apply

list_unique(list)

描述 计算列表中唯一元素的数量。
示例 list_unique([1, 1, NULL, -3, 1, 5])
Result 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中的BOOLEANs作为掩码应用于value_list的结果。
示例 list_where([10, 20, 30, 40], [true, false, false, true])
Result [10, 40]
别名 array_where

list_zip(list1, list2, ...)

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

unnest(list)

描述 将列表展开一级。请注意,这是一个特殊的函数,会改变结果的行数。更多详情请参见unnest页面
示例 unnest([1, 2, 3])
结果 1, 2, 3

列表操作符

列表支持以下操作符:

Operator Description Example Result
&& 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);
字符串
[你好, , 世界]
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] 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

range 函数创建一个在 startstop 之间的值列表。 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_series 函数在 startstop 之间创建一个值列表。 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);
范围
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年2月1日 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 Aggregates

函数 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_avg, list_var_samp, list_var_pop, list_stddev_pop, list_stddev_samp, list_sem, list_approx_count_distinct, list_bit_xor, list_bit_or, list_bit_and, list_bool_and, list_bool_or, list_count, list_entropy, list_last, list_first, list_kurtosis, list_kurtosis_pop, list_min, list_max, list_product, list_skewness, list_sum, list_string_agg, list_mode, list_median, list_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([]);
[]

如果展平的整个输入是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 函数用于将列表展开一级。