跳到主要内容

List 函数

函数描述
list[index]使用(从 1 开始的)index 提取单个列表元素。
list[begin[:end][:step]]使用切片约定提取子列表。支持负值。
list1 && list2list_has_any 的别名。
list1 <-> list2list_distance 的别名。
list1 <=> list2list_cosine_distance 的别名。
list1 <@ list2list_has_all 的别名。
list1 @> list2list_has_all 的别名。
[`arg1
aggregate(list, function_name, ...)list_aggregate 的别名。
apply(list, lambda(x))list_transform 的别名。
array_aggr(list, function_name, ...)list_aggregate 的别名。
array_aggregate(list, function_name, ...)list_aggregate 的别名。
array_append(list, element)list_append 的别名。
array_apply(list, lambda(x))list_transform 的别名。
array_cat(list_1, ..., list_n)list_concat 的别名。
array_concat(list_1, ..., list_n)list_concat 的别名。
array_contains(list, element)list_contains 的别名。
array_distinct(list)list_distinct 的别名。
array_extract(list, index)list 中提取第 index 个(从 1 开始)值。
array_filter(list, lambda(x))list_filter 的别名。
array_grade_up(list[, col1][, col2])list_grade_up 的别名。
array_has(list, element)list_contains 的别名。
array_has_all(list1, list2)list_has_all 的别名。
array_has_any(list1, list2)list_has_any 的别名。
array_indexof(list, element)list_position 的别名。
array_intersect(list1, list2)list_intersect 的别名。
array_length(list)length 的别名。
array_pop_back(list)返回去掉最后一个元素后的 list
array_pop_front(list)返回去掉第一个元素后的 list
array_position(list, element)list_position 的别名。
array_prepend(element, list)list_prepend 的别名。
array_push_back(list, element)list_append 的别名。
array_push_front(list, element)element 前置到 list
array_reduce(list, lambda(x,y)[, initial_value])list_reduce 的别名。
array_resize(list, size[[, value]])list_resize 的别名。
array_reverse(list)list_reverse 的别名。
array_reverse_sort(list[, col1])list_reverse_sort 的别名。
array_select(value_list, index_list)list_select 的别名。
array_slice(list, begin, end)list_slice 的别名。
array_slice(list, begin, end, step)list_slice 的别名。
array_sort(list[, col1][, col2])list_sort 的别名。
array_to_string(list, delimiter)使用可选的 delimiter 连接 list/array 元素。
array_to_string_comma_default(array)使用逗号分隔符合并 list/array 元素。
array_transform(list, lambda(x))list_transform 的别名。
array_unique(list)list_unique 的别名。
array_where(value_list, mask_list)list_where 的别名。
array_zip(list_1, ..., list_n[, truncate])list_zip 的别名。
char_length(list)length 的别名。
character_length(list)length 的别名。
concat(value, ...)连接多个字符串或列表。会跳过 NULL 输入。 另见[运算符 `
contains(list, element)如果 list 包含 element,则返回 true
filter(list, lambda(x))list_filter 的别名。
flatten(nested_list)Flattens a nested list by one level.
generate_series(start[, stop][, step])创建 startstop 之间的值列表,stop 参数为包含端。
grade_up(list[, col1][, col2])list_grade_up 的别名。
len(list)length 的别名。
length(list)返回 list 的长度。
list_aggr(list, function_name, ...)list_aggregate 的别名。
list_aggregate(list, function_name, ...)list 的元素上执行聚合函数 function_name。更多信息请参见 List 聚合 一节。
list_any_value(list)将聚合函数 any_value 应用于 list
list_append(list, element)element 追加到 list
list_apply(list, lambda(x))list_transform 的别名。
list_approx_count_distinct(list)将聚合函数 approx_count_distinct 应用于 list
list_avg(list)将聚合函数 avg 应用于 list
list_bit_and(list)将聚合函数 bit_and 应用于 list
list_bit_or(list)将聚合函数 bit_or 应用于 list
list_bit_xor(list)将聚合函数 bit_xor 应用于 list
list_bool_and(list)将聚合函数 bool_and 应用于 list
list_bool_or(list)将聚合函数 bool_or 应用于 list
list_cat(list_1, ..., list_n)list_concat 的别名。
list_concat(list_1, ..., list_n)连接多个列表。会跳过 NULL 输入。 另见[运算符 `
list_contains(list, element)如果列表包含该元素,则返回 true。
list_cosine_distance(list1, list2)计算两个等长列表之间的余弦距离。
list_cosine_similarity(list1, list2)计算两个等长列表之间的余弦相似度。
list_count(list)将聚合函数 count 应用于 list
list_distance(list1, list2)计算由两个等长输入列表给出的两点坐标之间的欧几里得距离。
list_distinct(list)移除列表中的所有重复值和 NULL 值,不保留原始顺序。
list_dot_product(list1, list2)list_inner_product 的别名。
list_element(list, index)list_extract 的别名。
list_entropy(list)将聚合函数 entropy 应用于 list
list_extract(list, index)从列表中提取第 index 个(从 1 开始)值。
list_filter(list, lambda(x))从输入 list 中筛选出使 lambda 函数返回 true 的元素并构造新列表。 Goose 必须能够将 lambda 函数的返回类型转换为 BOOLlist_filter 的返回类型与输入列表相同。 参见 list_filter 示例
list_first(list)将聚合函数 first 应用于 list
list_grade_up(list[, col1][, col2])行为类似 list_sort,但返回的是对应原列表位置的索引而非实际值。
list_has(list, element)list_contains 的别名。
list_has_all(list1, list2)如果 list2 的所有元素都在 list1 中,则返回 true。忽略 NULL。
list_has_any(list1, list2)如果两个列表有任意共同元素,则返回 true。忽略 NULL。
list_histogram(list)将聚合函数 histogram 应用于 list
list_indexof(list, element)list_position 的别名。
list_inner_product(list1, list2)计算两个等长列表之间的内积。
list_intersect(list1, list2)返回同时存在于 list1list2 中的所有元素列表,不包含重复项。
list_kurtosis(list)将聚合函数 kurtosis 应用于 list
list_kurtosis_pop(list)将聚合函数 kurtosis_pop 应用于 list
list_last(list)将聚合函数 last 应用于 list
list_mad(list)将聚合函数 mad 应用于 list
list_max(list)将聚合函数 max 应用于 list
list_median(list)将聚合函数 median 应用于 list
list_min(list)将聚合函数 min 应用于 list
list_mode(list)将聚合函数 mode 应用于 list
list_negative_dot_product(list1, list2)list_negative_inner_product 的别名。
list_negative_inner_product(list1, list2)计算两个等长列表之间的负内积。
list_pack(arg, ...)list_value 的别名。
list_position(list, element)如果 list 包含 element,则返回其索引;若未找到,则返回 NULL
list_prepend(element, list)element 前置到 list
list_product(list)将聚合函数 product 应用于 list
list_reduce(list, lambda(x,y)[, initial_value])通过在累积结果与下一个列表元素上执行 lambda 函数,将输入 list 的全部元素归约为单个标量值。 lambda 函数有一个可选的 initial_value 参数。 参见 list_reduce 示例
list_resize(list, size[[, value]])list 调整为包含 size 个元素。新元素使用 value 初始化;若未设置 value 则为 NULL
list_reverse(list)反转 list
list_reverse_sort(list[, col1])按逆序对列表元素排序。有关排序顺序和 NULL 值的更多信息,请参见列表排序
list_select(value_list, index_list)根据 index_list 选中的元素返回一个列表。
list_sem(list)将聚合函数 sem 应用于 list
list_skewness(list)将聚合函数 skewness 应用于 list
list_slice(list, begin, end)使用切片约定提取子列表或子字符串。支持负值。
list_slice(list, begin, end, step)带步长参数的 list_slice
list_sort(list[, col1][, col2])对列表元素进行排序。有关排序顺序和 NULL 值的更多信息,请参见列表排序
list_stddev_pop(list)将聚合函数 stddev_pop 应用于 list
list_stddev_samp(list)将聚合函数 stddev_samp 应用于 list
list_string_agg(list)将聚合函数 string_agg 应用于 list
list_sum(list)将聚合函数 sum 应用于 list
list_transform(list, lambda(x))返回对输入 list 的每个元素应用 lambda 函数后的结果列表。 返回类型由 lambda 函数的返回类型决定。 参见 list_transform 示例
list_unique(list)统计 list 中唯一元素的数量。
list_value(arg, ...)创建包含参数值的 LIST。
list_var_pop(list)将聚合函数 var_pop 应用于 list
list_var_samp(list)将聚合函数 var_samp 应用于 list
list_where(value_list, mask_list)mask_list 中的 BOOLEAN 作为掩码应用到 value_list,并返回结果列表。
list_zip(list_1, ..., list_n[, truncate])将 n 个 LIST 压缩为一个新的 LIST,其长度等于最长列表的长度。其元素是由各列表 list_1list_n 对应元素组成的结构体;缺失元素以 NULL 填充。若设置 truncate,则所有列表都会截断到最短长度。
range(start[, stop][, step])创建 startstop 之间的值列表,stop 参数为不包含端。
reduce(list, lambda(x,y)[, initial_value])list_reduce 的别名。
repeat(list, count)list 重复 count 次。
unnest(list)将列表展开一层。注意这是一个会改变结果基数的特殊函数。详见 unnest 页面
unpivot_list(arg, ...)list_value 相同,但会作为 unpivot 的一部分生成,以提供更好的错误信息。

list[index]

| 描述 | 使用(从 1 开始的)index 提取单个列表元素。 | | 示例 | [4, 5, 6][3] | | 结果 | 6 | | 别名 | list_extract |

list[begin[:end][:step]]

| 描述 | 使用切片约定提取子列表。支持负值。 | | 示例 | [4, 5, 6][3] | | 结果 | 6 | | 别名 | list_slice |

arg1 || arg2

| 描述 | 连接两个字符串、列表或 blob。任一输入为 NULL 时结果为 NULL。另见 concat(arg1, arg2, ...)list_concat(list1, list2, ...)。 | | 示例 1 | 'Duck' || 'DB' | | 结果 | Goose | | 示例 2 | [1, 2, 3] || [4, 5, 6] | | 结果 | [1, 2, 3, 4, 5, 6] | | 示例 3 | '\xAA'::BLOB || '\xBB'::BLOB | | 结果 | \xAA\xBB |

array_extract(list, index)

| 描述 | 从 list 中提取第 index 个(从 1 开始)值。 | | 示例 | array_extract([4, 5, 6], 3) | | 结果 | 6 |

array_pop_back(list)

| 描述 | 返回去掉最后一个元素后的 list。 | | 示例 | array_pop_back([4, 5, 6]) | | 结果 | [4, 5] |

array_pop_front(list)

| 描述 | 返回去掉第一个元素后的 list。 | | 示例 | array_pop_front([4, 5, 6]) | | 结果 | [5, 6] |

array_push_front(list, element)

| 描述 | 将 element 前置到 list。 | | 示例 | array_push_front([4, 5, 6], 3) | | 结果 | [3, 4, 5, 6] |

array_to_string(list, delimiter)

| 描述 | 使用可选的 delimiter 连接 list/array 元素。 | | 示例 1 | array_to_string([1, 2, 3], '-') | | 结果 | 1-2-3 | | 示例 2 | array_to_string(['aa', 'bb', 'cc'], '') | | 结果 | aabbcc |

array_to_string_comma_default(array)

| 描述 | 使用逗号分隔符合并 list/array 元素。 | | 示例 | array_to_string_comma_default(['Banana', 'Apple', 'Melon']) | | 结果 | Banana,Apple,Melon |

concat(value, ...)

| 描述 | 连接多个字符串或列表。会跳过 NULL 输入。 另见运算符 ||。 | | 示例 1 | concat('Hello', ' ', 'World') | | 结果 | Hello World | | 示例 2 | concat([1, 2, 3], NULL, [4, 5, 6]) | | 结果 | [1, 2, 3, 4, 5, 6] |

contains(list, element)

| 描述 | 如果 list 包含 element,则返回 true。 | | 示例 | contains([1, 2, NULL], 1) | | 结果 | true |

flatten(nested_list)

| 描述 | Flattens a nested list by one level. | | 示例 | flatten([[1, 2, 3], [4, 5]]) | | 结果 | [1, 2, 3, 4, 5] |

generate_series(start[, stop][, step])

| 描述 | 创建 startstop 之间的值列表,stop 参数为包含端。 | | 示例 | generate_series(2, 5, 3) | | 结果 | [2, 5] |

length(list)

| 描述 | 返回 list 的长度。 | | 示例 | length([1,2,3]) | | 结果 | 3 | | 别名 | char_length, character_length, len |

list_aggregate(list, function_name, ...)

| 描述 | 在 list 的元素上执行聚合函数 function_name。更多信息请参见 List 聚合 一节。 | | 示例 | list_aggregate([1, 2, NULL], 'min') | | 结果 | 1 | | 别名 | aggregate, array_aggr, array_aggregate, list_aggr |

list_any_value(list)

| 描述 | 将聚合函数 any_value 应用于 list。 | | 示例 | list_any_value([3,3,9]) | | 结果 | 3 |

list_append(list, element)

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

list_approx_count_distinct(list)

| 描述 | 将聚合函数 approx_count_distinct 应用于 list。 | | 示例 | list_approx_count_distinct([3,3,9]) | | 结果 | 2 |

list_avg(list)

| 描述 | 将聚合函数 avg 应用于 list。 | | 示例 | list_avg([3,3,9]) | | 结果 | 5.0 |

list_bit_and(list)

| 描述 | 将聚合函数 bit_and 应用于 list。 | | 示例 | list_bit_and([3,3,9]) | | 结果 | 1 |

list_bit_or(list)

| 描述 | 将聚合函数 bit_or 应用于 list。 | | 示例 | list_bit_or([3,3,9]) | | 结果 | 11 |

list_bit_xor(list)

| 描述 | 将聚合函数 bit_xor 应用于 list。 | | 示例 | list_bit_xor([3,3,9]) | | 结果 | 9 |

list_bool_and(list)

| 描述 | 将聚合函数 bool_and 应用于 list。 | | 示例 | list_bool_and([true, false]) | | 结果 | false |

list_bool_or(list)

| 描述 | 将聚合函数 bool_or 应用于 list。 | | 示例 | list_bool_or([true, false]) | | 结果 | true |

list_concat(list_1, ..., list_n)

| 描述 | 连接多个列表。会跳过 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 | | 别名 | array_contains, array_has, list_has |

list_cosine_distance(list1, list2)

| 描述 | 计算两个等长列表之间的余弦距离。 | | 示例 | list_cosine_distance([1, 2, 3], [1, 2, 3]) | | 结果 | 0.0 | | 别名 | <=> |

list_cosine_similarity(list1, list2)

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

list_count(list)

| 描述 | 将聚合函数 count 应用于 list。 | | 示例 | list_count([3,3,9]) | | 结果 | 3 |

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]) | | 结果 | [5, -3, 1] | | 别名 | array_distinct |

list_entropy(list)

| 描述 | 将聚合函数 entropy 应用于 list。 | | 示例 | list_entropy([3,3,9]) | | 结果 | 0.9182958340544893 |

list_extract(list, index)

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

list_filter(list, lambda(x))

| 描述 | 从输入 list 中筛选出使 lambda 函数返回 true 的元素并构造新列表。 Goose 必须能够将 lambda 函数的返回类型转换为 BOOLlist_filter 的返回类型与输入列表相同。 参见 list_filter 示例。 | | 示例 | list_filter([3, 4, 5], lambda x : x > 4) | | 结果 | [5] | | 别名 | array_filter, filter |

list_first(list)

| 描述 | 将聚合函数 first 应用于 list。 | | 示例 | list_first([3,3,9]) | | 结果 | 3 |

list_grade_up(list[, col1][, col2])

| 描述 | 行为类似 list_sort,但返回的是对应原列表位置的索引而非实际值。 | | 示例 | list_grade_up([3, 6, 1, 2]) | | 结果 | [3, 4, 1, 2] | | 别名 | array_grade_up, grade_up |

list_has_all(list1, list2)

| 描述 | 如果 list2 的所有元素都在 list1 中,则返回 true。忽略 NULL。 | | 示例 | list_has_all([1, 2, 3], [2, 3]) | | 结果 | true | | 别名 | <@, @>, array_has_all |

list_has_any(list1, list2)

| 描述 | 如果两个列表有任意共同元素,则返回 true。忽略 NULL。 | | 示例 | list_has_any([1, 2, 3], [2, 3, 4]) | | 结果 | true | | 别名 | &&, array_has_any |

list_histogram(list)

| 描述 | 将聚合函数 histogram 应用于 list。 | | 示例 | list_histogram([3,3,9]) | | 结果 | {3=2, 9=1} |

list_inner_product(list1, list2)

| 描述 | 计算两个等长列表之间的内积。 | | 示例 | list_inner_product([1, 2, 3], [1, 2, 3]) | | 结果 | 14.0 | | 别名 | list_dot_product |

list_intersect(list1, list2)

| 描述 | 返回同时存在于 list1list2 中的所有元素列表,不包含重复项。 | | 示例 | list_intersect([1, 2, 3], [2, 3, 4]) | | 结果 | [3, 2] | | 别名 | array_intersect |

list_kurtosis(list)

| 描述 | 将聚合函数 kurtosis 应用于 list。 | | 示例 | list_kurtosis([3,3,9]) | | 结果 | NULL |

list_kurtosis_pop(list)

| 描述 | 将聚合函数 kurtosis_pop 应用于 list。 | | 示例 | list_kurtosis_pop([3,3,9]) | | 结果 | -1.4999999999999978 |

list_last(list)

| 描述 | 将聚合函数 last 应用于 list。 | | 示例 | list_last([3,3,9]) | | 结果 | 9 |

list_mad(list)

| 描述 | 将聚合函数 mad 应用于 list。 | | 示例 | list_mad([3,3,9]) | | 结果 | 0.0 |

list_max(list)

| 描述 | 将聚合函数 max 应用于 list。 | | 示例 | list_max([3,3,9]) | | 结果 | 9 |

list_median(list)

| 描述 | 将聚合函数 median 应用于 list。 | | 示例 | list_median([3,3,9]) | | 结果 | 3.0 |

list_min(list)

| 描述 | 将聚合函数 min 应用于 list。 | | 示例 | list_min([3,3,9]) | | 结果 | 3 |

list_mode(list)

| 描述 | 将聚合函数 mode 应用于 list。 | | 示例 | list_mode([3,3,9]) | | 结果 | 3 |

list_negative_inner_product(list1, list2)

| 描述 | 计算两个等长列表之间的负内积。 | | 示例 | list_negative_inner_product([1, 2, 3], [1, 2, 3]) | | 结果 | -14.0 | | 别名 | list_negative_dot_product |

list_position(list, element)

| 描述 | 如果 list 包含 element,则返回其索引;若未找到,则返回 NULL。 | | 示例 | list_position([1, 2, NULL], 2) | | 结果 | 2 | | 别名 | array_indexof, array_position, list_indexof |

list_prepend(element, list)

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

list_product(list)

| 描述 | 将聚合函数 product 应用于 list。 | | 示例 | list_product([3,3,9]) | | 结果 | 81.0 |

list_reduce(list, lambda(x,y)[, initial_value])

| 描述 | 通过在累积结果与下一个列表元素上执行 lambda 函数,将输入 list 的全部元素归约为单个标量值。 lambda 函数有一个可选的 initial_value 参数。 参见 list_reduce 示例。 | | 示例 | list_reduce([1, 2, 3], lambda x, y : x + y) | | 结果 | 6 | | 别名 | array_reduce, reduce |

list_resize(list, size[[, value]])

| 描述 | 将 list 调整为包含 size 个元素。新元素使用 value 初始化;若未设置 value 则为 NULL。 | | 示例 | list_resize([1, 2, 3], 5, 0) | | 结果 | [1, 2, 3, 0, 0] | | 别名 | array_resize |

list_reverse(list)

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

list_reverse_sort(list[, col1])

| 描述 | 按逆序对列表元素排序。有关排序顺序和 NULL 值的更多信息,请参见列表排序。 | | 示例 | list_reverse_sort([3, 6, 1, 2]) | | 结果 | [6, 3, 2, 1] | | 别名 | array_reverse_sort |

list_select(value_list, index_list)

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

list_sem(list)

| 描述 | 将聚合函数 sem 应用于 list。 | | 示例 | list_sem([3,3,9]) | | 结果 | 1.6329931618554523 |

list_skewness(list)

| 描述 | 将聚合函数 skewness 应用于 list。 | | 示例 | list_skewness([3,3,9]) | | 结果 | 1.7320508075688796 |

list_slice(list, begin, end)

| 描述 | 使用切片约定提取子列表或子字符串。支持负值。 | | 示例 | list_slice([4, 5, 6], 2, 3) | | 结果 | [5, 6] | | 别名 | array_slice |

list_slice(list, begin, end, step)

| 描述 | 带步长参数的 list_slice。 | | 示例 | list_slice([4, 5, 6], 1, 3, 2) | | 结果 | [4, 6] | | 别名 | array_slice |

list_sort(list[, col1][, col2])

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

list_stddev_pop(list)

| 描述 | 将聚合函数 stddev_pop 应用于 list。 | | 示例 | list_stddev_pop([3,3,9]) | | 结果 | 2.8284271247461903 |

list_stddev_samp(list)

| 描述 | 将聚合函数 stddev_samp 应用于 list。 | | 示例 | list_stddev_samp([3,3,9]) | | 结果 | 3.4641016151377544 |

list_string_agg(list)

| 描述 | 将聚合函数 string_agg 应用于 list。 | | 示例 | list_string_agg([3,3,9]) | | 结果 | 3,3,9 |

list_sum(list)

| 描述 | 将聚合函数 sum 应用于 list。 | | 示例 | list_sum([3,3,9]) | | 结果 | 15 |

list_transform(list, lambda(x))

| 描述 | 返回对输入 list 的每个元素应用 lambda 函数后的结果列表。 返回类型由 lambda 函数的返回类型决定。 参见 list_transform 示例。 | | 示例 | list_transform([1, 2, 3], lambda x : x + 1) | | 结果 | [2, 3, 4] | | 别名 | apply, array_apply, array_transform, list_apply |

list_unique(list)

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

list_value(arg, ...)

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

list_var_pop(list)

| 描述 | 将聚合函数 var_pop 应用于 list。 | | 示例 | list_var_pop([3,3,9]) | | 结果 | 8.0 |

list_var_samp(list)

| 描述 | 将聚合函数 var_samp 应用于 list。 | | 示例 | list_var_samp([3,3,9]) | | 结果 | 12.0 |

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(list_1, ..., list_n[, truncate])

| 描述 | 将 n 个 LIST 压缩为一个新的 LIST,其长度等于最长列表的长度。其元素是由各列表 list_1list_n 对应元素组成的结构体;缺失元素以 NULL 填充。若设置 truncate,则所有列表都会截断到最短长度。 | | 示例 1 | list_zip([1, 2], [3, 4], [5, 6]) | | 结果 | [(1, 3, 5), (2, 4, 6)] | | 示例 2 | list_zip([1, 2], [3, 4], [5, 6, 7]) | | 结果 | [(1, 3, 5), (2, 4, 6), (NULL, NULL, 7)] | | 示例 3 | list_zip([1, 2], [3, 4], [5, 6, 7], true) | | 结果 | [(1, 3, 5), (2, 4, 6)] | | 别名 | array_zip |

range(start[, stop][, step])

| 描述 | 创建 startstop 之间的值列表,stop 参数为不包含端。 | | 示例 | range(2, 5, 3) | | 结果 | [2] |

repeat(list, count)

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

unnest(list)

| 描述 | 将列表展开一层。注意这是一个会改变结果基数的特殊函数。详见 unnest 页面。 | | 示例 | unnest([1, 2, 3]) | | 结果 | Multiple rows: '1', '2', '3' |

unpivot_list(arg, ...)

| 描述 | 与 list_value 相同,但会作为 unpivot 的一部分生成,以提供更好的错误信息。 | | 示例 | unpivot_list(4, 5, 6) | | 结果 | [4, 5, 6] |

List 运算符

列表支持以下运算符:

运算符描述示例结果
&&Alias for list_has_any.[1, 2, 3, 4, 5] && [2, 5, 5, 6]true
@>Alias for list_has_all, where the list on the right of the operator is the sublist.[1, 2, 3, 4] @> [3, 4, 3]true
<@Alias for list_has_all, where the list on the left of the operator is the sublist.[1, 4] <@ [1, 2, 3, 4]true
``Similar to list_concat, except any NULL input results in NULL.
<=>Alias for list_cosine_distance.[1, 2, 3] <=> [1, 2, 5]0.007416606
<->Alias for list_distance.[1, 2, 3] <-> [1, 2, 5]2.0

List 推导式

Python-style list comprehension can be used to compute expressions over elements in a list. 例如:

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

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

SELECT [4, 5, 6] AS l, [x FOR x, i IN l IF i != 2] AS filtered;
lfiltered
[4, 5, 6][4, 6]

底层上,[f(x) FOR x IN l IF g(x)] 会被转换为:

l.list_apply(lambda x, i: {'filter': g(x, i), 'result': f(x, i)})
.list_filter(lambda x: x.filter)
.list_apply(lambda x: x.result)

Range 函数

Goose 提供两个 range 函数,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 for 日期范围

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 for 日期范围

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 (optional)
    • 切片中元素之间的步长
    • 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 聚合

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

list_aggregate 在聚合函数名之后还可接收额外参数。这些额外参数会直接传递给对应聚合函数。

对顺序敏感的聚合函数会按列表顺序执行。list_aggregate 不支持 ORDER BYDISTINCTFILTER 子句。 可通过 list_sortlist_grade_uplist_selectlist_distinctlist_filter 进行等效模拟。

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_* Rewrite Functions

以下是现有重写函数列表。重写函数只接收列表(列)作为参数,从而简化了 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_mad and list_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

使用可选分隔符连接 list/array 元素。

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 值应放在列表开头还是结尾。 其排序行为与 Goose 的 ORDER BY 子句一致。 因此,(嵌套)值在 list_sortORDER BY 中的比较方式相同。

默认情况下,如果不提供修饰符,Goose 使用 ASC NULLS LAST 排序。 即值按升序排序,NULL 值放在最后。 默认排序顺序可通过 PRAGMA 语句修改。

list_sort 允许用户选择使用默认排序顺序或自定义顺序。 list_sort 最多接受两个额外可选参数。 第二个参数指定排序方向,可为 ASCDESC。 第三个参数指定 NULL 顺序,可为 NULLS FIRSTNULLS LAST

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

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

该查询指定了排序顺序。 NULL 顺序使用可配置的默认值。

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

该查询同时指定排序顺序和 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]);
[-5, 1, 3, 5, NULL, NULL]

该查询指定了 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 函数

Goose 支持 lambda parameter1, parameter2, ...: expression 形式的 lambda 函数。 详情请参见 lambda 函数页面