Documentation
/ SQL
/ Functions
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) |
返回一个包含所有在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) |
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]) |
将k个LIST 压缩成一个新的LIST ,其长度将是最长列表的长度。其元素是来自每个列表list_1 , …, list_k 的k个元素的结构体,缺失的元素将被替换为NULL 。如果设置了truncate ,则所有列表将被截断为最小列表长度。 |
unnest(list) |
将列表展开一层。请注意,这是一个特殊函数,会改变结果的行数。更多详情请参见unnest 页面。 |
描述 |
括号符号是list_extract 的别名。 |
示例 |
[4, 5, 6][3] |
结果 |
6 |
别名 |
list_extract |
描述 |
带有冒号的括号表示法是 list_slice 的别名。 |
示例 |
[4, 5, 6][2:3] |
Result |
[5, 6] |
别名 |
list_slice |
描述 |
在括号表示法中使用list_slice ,并添加了step 功能。 |
示例 |
[4, 5, 6][:-:2] |
结果 |
[4, 6] |
别名 |
list_slice |
描述 |
返回不包含最后一个元素的列表。 |
示例 |
array_pop_back([4, 5, 6]) |
结果 |
[4, 5] |
描述 |
返回没有第一个元素的列表。 |
示例 |
array_pop_front([4, 5, 6]) |
Result |
[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') |
Result |
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]) |
结果 |
[2, 3, 4, 5, 6] |
别名 |
list_cat , array_concat , array_cat |
描述 |
如果列表包含该元素,则返回 true。 |
示例 |
list_contains([1, 2, NULL], 1) |
Result |
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]) |
Result |
0.007416606 |
描述 |
计算两个点之间的欧几里得距离,这两个点的坐标由两个长度相等的输入列表给出。 |
示例 |
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]) |
Result |
20.0 |
别名 |
list_inner_product |
描述 |
计算两个相同大小的数字列表的负点积。等同于 - list_dot_product |
示例 |
list_negative_dot_product([1, 2, 3], [1, 2, 5]) |
Result |
-20.0 |
别名 |
list_negative_inner_product |
描述 |
从列表中提取第index 个(基于1的)值。 |
示例 |
list_extract([4, 5, 6], 3) |
Result |
6 |
别名 |
list_element , array_extract |
描述 |
从输入列表中构造一个列表,该列表包含lambda函数返回true的元素。有关更多详细信息,请参阅Lambda Functions页面。 |
Example |
list_filter([4, 5, 6], x -> x > 4) |
Result |
[5, 6] |
Aliases |
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]) |
Result |
true |
别名 |
array_has_all |
描述 |
如果两个列表中存在任何相同的元素,则返回true。 |
示例 |
list_has_any([1, 2, 3], [2, 3, 4]) |
Result |
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) |
Result |
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 Functions页面。 |
Example |
list_reduce([4, 5, 6], (x, y) -> x + y) |
Result |
15 |
Aliases |
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 |
描述 |
list_slice 增加了 step 功能。 |
示例 |
list_slice([4, 5, 6], 1, 3, 2) |
Result |
[4, 6] |
别名 |
array_slice |
描述 |
使用切片约定提取子列表。接受负值。参见切片。 |
示例 |
list_slice([4, 5, 6], 2, 3) |
Result |
[5, 6] |
别名 |
array_slice |
描述 |
对列表中的元素进行排序。有关排序顺序和NULL 排序顺序的更多详细信息,请参阅排序列表部分。 |
示例 |
list_sort([3, 6, 1, 2]) |
结果 |
[1, 2, 3, 6] |
别名 |
array_sort |
描述 |
返回一个列表,该列表是将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([1, 1, NULL, -3, 1, 5]) |
Result |
3 |
别名 |
array_unique |
描述 |
创建一个包含参数值的LIST 。 |
示例 |
list_value(4, 5, 6) |
结果 |
[4, 5, 6] |
别名 |
list_pack |
描述 |
返回一个列表,其中包含将mask_list 中的BOOLEAN s作为掩码应用于value_list 的结果。 |
示例 |
list_where([10, 20, 30, 40], [true, false, false, true]) |
Result |
[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 |
描述 |
将列表展开一级。请注意,这是一个特殊的函数,会改变结果的行数。更多详情请参见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);
列表推导式也可以通过添加第二个变量来使用列表元素的位置。
在下面的例子中,我们使用x, i
,其中x
是值,i
是位置:
SELECT [4, 5, 6] AS l, [x FOR x, i IN l IF i != 2] 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);
范围 |
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年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
时,切片会反转,并且 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
值时具有特定的行为。
如果输入列表为空,则返回一个空列表:
如果展平的整个输入是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
函数用于将列表展开一级。