名称 |
描述 |
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) |
返回一个包含 l1 和 l2 中所有共同元素的列表,无重复项。 |
list_position(list, element) |
如果列表包含该元素,则返回该元素的索引。如果未找到该元素,则返回 NULL 。 |
list_prepend(element, list) |
将 element 前置到 list 。 |
list_reduce(list, lambda) |
返回一个单一值,它是将 lambda 函数应用于输入列表的每个元素的结果。有关更多详细信息,请参阅Lambda 函数页面。 |
list_resize(list, size[, value]) |
调整列表大小以包含 size 个元素。如果未设置 value ,则使用 value 或 NULL 初始化新元素。 |
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_extract 的别名。 |
示例 |
[4, 5, 6][3] |
结果 |
6 |
别名 |
list_extract |
描述 |
带冒号的方括号表示法是 list_slice 的别名。 |
示例 |
[4, 5, 6][2:3] |
结果 |
[5, 6] |
别名 |
list_slice |
描述 |
带 step 参数的方括号表示法 list_slice 。 |
示例 |
[4, 5, 6][:-:2] |
结果 |
[4, 6] |
别名 |
list_slice |
描述 |
返回移除了最后一个元素的列表。 |
示例 |
array_pop_back([4, 5, 6]) |
结果 |
[4, 5] |
描述 |
返回移除了第一个元素的列表。 |
示例 |
array_pop_front([4, 5, 6]) |
结果 |
[5, 6] |
描述 |
将列表的列表连接成单个列表。这只平展列表的一个级别(参见示例)。 |
示例 |
flatten([[1, 2], [3, 4]]) |
结果 |
[1, 2, 3, 4] |
描述 |
返回列表的长度。 |
示例 |
len([1, 2, 3]) |
结果 |
3 |
别名 |
array_length |
描述 |
对 list 的元素执行聚合函数 name 。有关更多详细信息,请参阅列表聚合部分。 |
示例 |
list_aggregate([1, 2, NULL], 'min') |
结果 |
1 |
别名 |
list_aggr , aggregate , array_aggregate , array_aggr |
描述 |
返回列表中第一个非空值。 |
示例 |
list_any_value([NULL, -3]) |
结果 |
-3 |
描述 |
将 element 追加到 list 。 |
示例 |
list_append([2, 3], 4) |
结果 |
[2, 3, 4] |
别名 |
array_append , array_push_back |
描述 |
连接列表。NULL 输入会被跳过。另请参阅 || |
示例 |
list_concat([2, 3], [4, 5, 6], [7]) |
结果 |
[2, 3, 4, 5, 6, 7] |
别名 |
list_cat , array_concat , array_cat |
描述 |
如果列表包含该元素,则返回 true。 |
示例 |
list_contains([1, 2, NULL], 1) |
结果 |
true |
别名 |
list_has , array_contains , array_has |
描述 |
计算两个列表之间的余弦相似度。 |
示例 |
list_cosine_similarity([1, 2, 3], [1, 2, 5]) |
结果 |
0.9759000729485332 |
描述 |
计算两个列表之间的余弦距离。等同于 1.0 - list_cosine_similarity |
示例 |
list_cosine_distance([1, 2, 3], [1, 2, 5]) |
结果 |
0.024099927051466796 |
描述 |
计算两个等长输入列表中给定坐标的两个点之间的欧几里得距离。 |
示例 |
list_distance([1, 2, 3], [1, 2, 5]) |
结果 |
2.0 |
描述 |
从列表中移除所有重复项和 NULL 值。不保留原始顺序。 |
示例 |
list_distinct([1, 1, NULL, -3, 1, 5]) |
结果 |
[1, 5, -3] |
别名 |
array_distinct |
描述 |
计算两个大小相同数字列表的点积。 |
示例 |
list_dot_product([1, 2, 3], [1, 2, 5]) |
结果 |
20.0 |
别名 |
list_inner_product |
描述 |
计算两个大小相同数字列表的负点积。等同于 - list_dot_product |
示例 |
list_negative_dot_product([1, 2, 3], [1, 2, 5]) |
结果 |
-20.0 |
别名 |
list_negative_inner_product |
描述 |
从列表中提取第 index 个(基于 1)值。 |
示例 |
list_extract([4, 5, 6], 3) |
结果 |
6 |
别名 |
list_element , array_extract |
描述 |
从输入列表中 lambda 函数返回 true 的元素构造一个列表。有关更多详细信息,请参阅Lambda 函数页面。 |
示例 |
list_filter([4, 5, 6], x -> x > 4) |
结果 |
[5, 6] |
别名 |
array_filter , filter |
描述 |
功能类似于排序,但结果是与原始 list 中的位置对应的索引,而不是实际值。 |
示例 |
list_grade_up([30, 10, 40, 20]) |
结果 |
[2, 4, 1, 3] |
别名 |
array_grade_up |
描述 |
如果子列表的所有元素都存在于列表中,则返回 true。 |
示例 |
list_has_all([4, 5, 6], [4, 6]) |
结果 |
true |
别名 |
array_has_all |
描述 |
如果任何元素存在于两个列表中,则返回 true。 |
示例 |
list_has_any([1, 2, 3], [2, 3, 4]) |
结果 |
true |
别名 |
array_has_any |
描述 |
返回一个包含 l1 和 l2 中所有共同元素的列表,无重复项。 |
示例 |
list_intersect([1, 2, 3], [2, 3, 4]) |
结果 |
[2, 3] |
别名 |
array_intersect |
描述 |
如果列表包含该元素,则返回该元素的索引。如果未找到该元素,则返回 NULL 。 |
示例 |
list_position([1, 2, NULL], 2) |
结果 |
2 |
别名 |
list_indexof , array_position , array_indexof |
描述 |
将 element 前置到 list 。 |
示例 |
list_prepend(3, [4, 5, 6]) |
结果 |
[3, 4, 5, 6] |
别名 |
array_prepend , array_push_front |
描述 |
返回一个单一值,它是将 lambda 函数应用于输入列表的每个元素的结果。有关更多详细信息,请参阅Lambda 函数页面。 |
示例 |
list_reduce([4, 5, 6], (acc, x) -> acc + x) |
结果 |
15 |
别名 |
array_reduce , reduce |
描述 |
调整列表大小以包含 size 个元素。如果未设置 value ,则使用 value 或 NULL 初始化新元素。 |
示例 |
list_resize([1, 2, 3], 5, 0) |
结果 |
[1, 2, 3, 0, 0] |
别名 |
array_resize |
描述 |
以逆序对列表元素进行排序。有关 NULL 排序顺序的更多详细信息,请参阅列表排序部分。 |
示例 |
list_reverse_sort([3, 6, 1, 2]) |
结果 |
[6, 3, 2, 1] |
别名 |
array_reverse_sort |
描述 |
反转列表。 |
示例 |
list_reverse([3, 6, 1, 2]) |
结果 |
[2, 1, 6, 3] |
别名 |
array_reverse |
描述 |
根据 index_list 选择的元素返回一个列表。 |
示例 |
list_select([10, 20, 30, 40], [1, 4]) |
结果 |
[10, 40] |
别名 |
array_select |
描述 |
带有 step 功能的 list_slice 。 |
示例 |
list_slice([4, 5, 6], 1, 3, 2) |
结果 |
[4, 6] |
别名 |
array_slice |
描述 |
使用切片约定提取子列表。接受负值。参见切片。 |
示例 |
list_slice([4, 5, 6], 2, 3) |
结果 |
[5, 6] |
别名 |
array_slice |
描述 |
对列表元素进行排序。有关排序顺序和 NULL 排序顺序的更多详细信息,请参阅列表排序部分。 |
示例 |
list_sort([3, 6, 1, 2]) |
结果 |
[1, 2, 3, 6] |
别名 |
array_sort |
描述 |
返回一个列表,它是将 lambda 函数应用于输入列表的每个元素的结果。有关更多详细信息,请参阅Lambda 函数页面。 |
示例 |
list_transform([4, 5, 6], x -> x + 1) |
结果 |
[5, 6, 7] |
别名 |
array_transform , apply , list_apply , array_apply |
描述 |
计算列表中唯一元素的数量。 |
示例 |
list_unique([1, 1, NULL, -3, 1, 5]) |
结果 |
3 |
别名 |
array_unique |
描述 |
创建一个包含参数值的 LIST 。 |
示例 |
list_value(4, 5, 6) |
结果 |
[4, 5, 6] |
别名 |
list_pack |
描述 |
返回一个列表,其中 mask_list 中的 BOOLEAN 值作为掩码应用于 value_list 。 |
示例 |
list_where([10, 20, 30, 40], [true, false, false, true]) |
结果 |
[10, 40] |
别名 |
array_where |
描述 |
将 *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 |
描述 |
重复 list count 次。 |
示例 |
repeat([1, 2], 5) |
结果 |
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2] |
描述 |
将列表解除嵌套一层。请注意,这是一个特殊函数,会改变结果的基数。有关更多详细信息,请参阅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);
SELECT [upper(x) FOR x IN strings IF len(x) > 0] AS strings
FROM (VALUES (['Hello', '', 'World'])) t(strings);
列表推导式还可以通过添加第二个变量来使用列表元素的位置。在以下示例中,我们使用 x, i
,其中 x
是值,i
是位置
SELECT [4, 5, 6] AS l, [x FOR x, i IN l IF i != 2] AS filtered;
在底层,[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)
,以及它们带有 stop
和 step
默认参数的变体。这两个函数在 stop
参数方面的行为不同。详细说明如下。
函数 range
在 start
和 stop
之间创建一系列值。start
参数是包含的,而 stop
参数是排他的。start
的默认值为 0,step
的默认值为 1。
根据参数的数量,range
存在以下变体。
函数 generate_series
在 start
和 stop
之间创建一系列值。start
和 stop
参数都是包含的。start
的默认值为 0,step
的默认值为 1。根据参数的数量,generate_series
存在以下变体。
SELECT generate_series(5);
SELECT generate_series(2, 5);
SELECT generate_series(2, 5, 3);
函数 generate_subscripts(arr, dim)
沿着数组 arr
的第 dim
维度生成索引。
SELECT generate_subscripts([4, 5, 6], 1) AS i;
TIMESTAMP
和 TIMESTAMP WITH TIME ZONE
值也支持日期范围。请注意,对于这些类型,stop
和 step
参数必须明确指定(不提供默认值)。
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 |
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
时,切片将被反转,并且 begin
和 end
将互换
- 必须为非零
示例
SELECT list_slice([1, 2, 3, 4, 5], 2, 4);
SELECT ([1, 2, 3, 4, 5])[2:4:2];
SELECT([1, 2, 3, 4, 5])[4:2:-2];
SELECT ([1, 2, 3, 4, 5])[:];
SELECT ([1, 2, 3, 4, 5])[:-:2];
SELECT ([1, 2, 3, 4, 5])[:-:-2];
函数 list_aggregate
允许对列表元素执行任意现有聚合函数。它的第一个参数是列表(列),第二个参数是聚合函数名称,例如 min
、histogram
或 sum
。
list_aggregate
在聚合函数名称之后接受额外的参数。这些额外参数直接传递给聚合函数,聚合函数作为 list_aggregate
的第二个参数。
SELECT list_aggregate([1, 2, -4, NULL], 'min');
SELECT list_aggregate([2, 4, 8, 42], 'sum');
SELECT list_aggregate([[1, 2], [NULL], [2, 10, 3]], 'last');
SELECT list_aggregate([2, 4, 8, 42], 'string_agg', '|');
以下是现有重写函数的列表。重写函数通过仅将列表(列)作为其参数来简化列表聚合函数的使用。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_mad
和 list_histogram
。
SELECT list_min([1, 2, -4, NULL]);
SELECT list_sum([2, 4, 8, 42]);
SELECT list_last([[1, 2], [NULL], [2, 10, 3]]);
使用可选的分隔符连接列表/数组元素。
SELECT array_to_string([1, 2, 3], '-') AS str;
这等同于以下 SQL
SELECT list_aggr([1, 2, 3], 'string_agg', '-') AS str;
函数 list_sort
以升序或降序对列表元素进行排序。此外,它允许指定 NULL
值应移至列表开头还是末尾。它与 DuckDB 的 ORDER BY
子句具有相同的排序行为。因此,list_sort
中的(嵌套)值与 ORDER BY
中的比较结果相同。
默认情况下,如果没有提供修饰符,DuckDB 会按 ASC NULLS FIRST
排序。即,值按升序排序,并且 NULL
值排在前面。这与 SQLite 的默认排序顺序相同。默认排序顺序可以使用 PRAGMA
语句更改。
list_sort
允许用户选择使用默认排序顺序还是自定义顺序。list_sort
最多接受两个额外的可选参数。第二个参数提供排序顺序,可以是 ASC
或 DESC
。第三个参数提供 NULL
顺序,可以是 NULLS FIRST
或 NULLS 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
顺序。
SELECT list_sort([1, 3, NULL, 2], 'DESC', 'NULLS FIRST');
list_reverse_sort
有一个可选的第二个参数,用于提供 NULL
排序顺序。它可以是 NULLS FIRST
或 NULLS 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');
flatten 函数是一个标量函数,它通过连接每个子列表将列表的列表转换为单个列表。请注意,这只是一次平展一个级别,而不是所有级别的子列表。
将列表的列表转换为单个列表
SELECT
flatten([
[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
值时有特定的行为。
如果输入列表为空,则返回空列表
如果 flatten 的整个输入为 NULL
,则返回 NULL
如果一个唯一条目为 NULL
的列表被平展,则返回一个空列表
如果列表的列表中的子列表只包含 NULL
,则不修改该子列表
-- (Note the extra set of parentheses vs. the prior example)
SELECT flatten([[NULL]]);
即使每个子列表的唯一内容是 NULL
,仍将其连接在一起。请注意,平展时不会进行去重。有关去重,请参见 list_distinct
函数
SELECT flatten([[NULL], [NULL]]);
DuckDB 支持 (parameter1, parameter2, ...) -> expression
形式的 lambda 函数。有关详细信息,请参见lambda 函数页面。
- 聚合函数
list
和 histogram
产生列表和结构体列表。
unnest
函数用于将列表解除嵌套一层。