数组函数
array
引入于:v1.1
根据函数参数创建一个数组。
参数必须是常量,并且其类型必须具有一个共同的超类型。
必须至少传入一个参数,否则无法确定要创建哪种类型的数组。
这意味着不能使用此函数来创建空数组。若要创建空数组,请使用 emptyArray* 函数。
可以使用 [ ] 运算符实现相同的功能。
语法
参数
x1— 任意类型 T 的常量值。如果只提供此参数,则数组类型为 T。-[, x2, ..., xN]— 额外的 N 个常量值,与x1具有共同的超类型
返回值
返回一个数组,其中 'T' 是所有传入参数的最小公共类型。Array(T)
示例
有效用法
用法无效
arrayAUCPR
引入版本:v20.4
计算精确率-召回率(PR)曲线下面积。 精确率-召回率曲线是通过在所有阈值下,将精确率绘制在 y 轴、召回率绘制在 x 轴而得到的。 结果值范围为 0 到 1,值越高表示模型性能越好。 在处理类别分布不平衡的数据集时,PR AUC 尤其有用,相比 ROC AUC 能在这类场景下提供更清晰的性能对比。 更多细节请参见此处、此处和此处。
语法
别名: arrayPRAUC
参数
cores— 预测模型输出的分数。Array((U)Int*)或Array(Float*)labels— 样本标签,通常正样本为 1,负样本为 0。Array((U)Int*)或Array(Enum)partial_offsets—- 可选。一个由三个非负整数组成的
Array(T),用于计算 PR 曲线下的部分面积(等价于 PR 空间中的一个垂直带状区域),而不是整个 AUC。此选项对于分布式计算 PR AUC 很有用。该数组必须包含以下元素 [higher_partitions_tp,higher_partitions_fp,total_positives]。higher_partitions_tp:得分更高的各分区中正标签的数量。higher_partitions_fp:得分更高的各分区中负标签的数量。total_positives:整个数据集中正样本的总数。
当使用 arr_partial_offsets 时,arr_scores 和 arr_labels 应仅对应整个数据集中的一个分区,并且该分区只包含某一分数区间内的样本。
数据集应被划分为一系列相邻的连续分区,其中每个分区包含分数落在某个特定范围内的数据子集。
例如:
- 一个分区可以包含所有位于区间 [0, 0.5) 内的分数。
- 另一个分区可以包含位于区间 [0.5, 1.0] 内的分数。
返回值
返回精确率-召回率(PR)曲线下的面积。Float64
示例
用法示例
arrayAll
引入版本:v1.1
如果 lambda func(x [, y1, y2, ... yN]) 对所有元素的返回值都为 true,则返回 1;否则,返回 0。
语法
参数
func(x[, y1, ..., yN])— 一个对源数组(x)和条件数组(y)的元素进行操作的 Lambda 函数。Lambda functionsource_arr— 要处理的源数组。Array(T)cond1_arr, ...— 可选。N 个条件数组,为 Lambda 函数提供额外参数。Array(T)
返回值
如果 Lambda 函数对所有元素都返回 true,则返回 1,否则返回 0。UInt8
示例
所有元素都满足条件
并非所有元素都相匹配
arrayAvg
引入于:v21.1
返回源数组中元素的平均值。
如果指定了 lambda 函数 func,则返回对元素应用该 lambda 函数后所得结果的平均值。
语法
参数
func(x[, y1, ..., yN])— 可选。作用于源数组(x)及条件数组(y)元素的 Lambda 函数。Lambda functionsource_arr— 要处理的源数组。Array(T)[, cond1_arr, ... , condN_arr]— 可选。提供给 Lambda 函数的 N 个条件数组,作为附加参数。Array(T)
返回值
返回源数组中元素的平均值;如果提供了 Lambda 函数,则返回其结果元素的平均值。Float64
示例
基础示例
在 Lambda 函数中的用法
arrayCompact
自 v20.1 版本引入
从数组中移除连续的重复元素,包括 null 值。结果数组中各值的顺序与源数组中的顺序一致。
语法
参数
arr— 需要去重的数组。Array(T)
返回值
返回一个不包含重复值的数组。Array(T)
示例
用法示例
arrayConcat
自 v1.1 版本引入
合并作为参数传入的数组。
语法
参数
arr1 [, arr2, ... , arrN]— 要拼接的 N 个数组。Array(T)
返回值
返回一个由提供的数组参数合并而成的单个数组。Array(T)
示例
用法示例
arrayCount
引入版本:v1.1
返回使 func(arr1[i], ..., arrN[i]) 的结果为 true 的元素数量。
如果未指定 func,则返回数组中非零元素的数量。
arrayCount 是一个高阶函数。
语法
参数
func— 可选。应用到每个数组元素上的函数。Lambda functionarr1, ..., arrN— N 个数组。Array(T)
返回值
返回使 func 返回 true 的元素个数。否则,返回数组中非零元素的个数。UInt32
示例
用法示例
arrayCumSum
首次引入于:v1.1
返回一个数组,其中每个元素是源数组对应位置的前缀和(累计和)。如果指定了 lambda 函数,则在每个位置先对数组元素应用该 lambda,再对结果进行累计求和。
语法
参数
func— 可选。应用于数组各位置元素的 lambda 函数。Lambda functionarr1— 源数值数组。Array(T)[arr2, ..., arrN]— 可选。与arr1长度相同的附加数组,如果指定了 lambda 函数,这些数组会作为参数传递给该函数。Array(T)
返回值
返回一个数组,其中包含源数组元素的部分和(前缀和)。结果类型与输入数组的数值类型相同。Array(T)
示例
基本用法
使用 lambda 表达式
arrayCumSumNonNegative
引入版本:v18.12
返回一个数组,其中包含源数组元素的部分(逐步)累计和,并将任何为负的累计和替换为零。如果指定了 lambda 函数,则在每个位置先对数组元素应用该 lambda,再对结果进行累计求和。
语法
参数
func— 可选。一个应用于数组中各位置元素的 lambda 函数。Lambda functionarr1— 数值类型的源数组。Array(T)[arr2, ..., arrN]— 可选。与arr1大小相同的其他数组,如果指定了 lambda 函数,这些数组会作为参数传递给该函数。Array(T)
返回值
返回源数组元素的部分和数组,其中任何为负的累积和都会被替换为零。结果类型与输入数组的数值类型一致。Array(T)
示例
基本用法
使用 Lambda
arrayDifference
引入版本:v1.1
计算一个数组,其元素为原数组中相邻元素之间的差值。
结果数组的第一个元素为 0,第二个元素为 arr[1] - arr[0],第三个元素为 arr[2] - arr[1],以此类推。
结果数组中元素的类型由减法的类型推断规则决定(例如 UInt8 - UInt8 = Int16)。
语法
参数
arr— 要计算相邻元素差值的数组。Array(T)
返回值
返回一个由相邻数组元素之间的差值组成的数组 UInt*
示例
使用示例
结果类型为 Int64 时发生溢出的示例
arrayDistinct
引入于:v1.1
返回一个仅包含数组中各不相同(去重后)元素的数组。
语法
参数
arr— 要从中提取不同元素的数组。Array(T)
返回值
返回一个包含不同元素的数组 Array(T)
示例
使用示例
arrayDotProduct
自 v23.5 引入
返回两个数组的点积。
两个向量的长度必须相等。Array 和 Tuple 中的元素类型也可以是混合的。
语法
参数
v1— 第一个向量。Array((U)Int* | Float* | Decimal)或Tuple((U)Int* | Float* | Decimal)v2— 第二个向量。Array((U)Int* | Float* | Decimal)或Tuple((U)Int* | Float* | Decimal)
返回值
两个向量的点积。
返回类型由参数的类型确定。如果 Array 或 Tuple 中包含不同类型的元素,则结果类型为它们的超类型。
示例
Array 示例
元组示例
arrayElement
引入于:v1.1
获取给定数组中索引为 n 的元素,其中 n 可以是任意整数类型。
如果索引超出数组边界,则返回默认值(数字为 0,字符串为空字符串等),
当数组参数为非常量且索引为常量 0 时除外。在这种情况下会报错 Array indices are 1-based。
ClickHouse 中的数组索引从 1 开始。
支持负索引。在这种情况下,将从末尾开始计数,选取对应元素。例如,arr[-1] 是数组中的最后一个元素。
运算符 [n] 提供相同的功能。
语法
参数
返回值
返回由给定数组参数合并得到的单个数组 Array(T)。
示例
使用示例
负索引
使用 [n] 记法
数组下标越界
arrayElementOrNull
引入于:v1.1
获取给定数组中索引为 n 的元素,其中 n 可以是任意整数类型。
如果索引超出了数组的范围,则返回 NULL,而不是默认值。
ClickHouse 中的数组索引从 1 开始。
支持负索引。这时会从数组末尾开始计数来选择对应的元素。例如,arr[-1] 是数组中的最后一个元素。
语法
参数
arrays— 任意数量的数组参数。Array
返回值
返回由提供的数组参数合并得到的单个数组。Array(T)
示例
使用示例
负索引
数组索引越界
arrayEnumerate
引入版本:v1.1
返回数组 [1, 2, 3, ..., length(arr)]
此函数通常与 ARRAY JOIN 子句一起使用。它允许在应用 ARRAY JOIN 之后,对每个数组只统计一次。
此函数也可以用于高阶函数。例如,你可以使用它来获取满足某个条件的元素在数组中的索引。
语法
参数
arr— 要枚举的数组。Array
返回值
返回数组 [1, 2, 3, ..., length (arr)]。Array(UInt32)
示例
使用 ARRAY JOIN 的基本示例
arrayEnumerateDense
自 v18.12 版本引入
返回一个与源数组大小相同的数组,用于标记每个元素在源数组中首次出现的位置。
语法
参数
arr— 要枚举的数组。Array(T)
返回值
返回一个与 arr 大小相同的数组,其中每个元素表示对应元素在源数组 Array(T) 中首次出现的位置。
示例
用法示例
arrayEnumerateDenseRanked
自 v20.1 引入
返回一个与源数组大小相同的数组,用于标示每个元素在源数组中首次出现的索引位置。它支持对多维数组进行枚举,并且可以指定在数组中向内遍历的深度。
语法
参数
clear_depth— 在指定层级分别枚举元素。必须小于或等于max_arr_depth。UInt*arr— 要枚举的 N 维数组。Array(T)max_array_depth— 最大有效深度。必须小于或等于arr的深度。UInt*
返回值
返回一个数组,用于表示每个元素在源数组中首次出现的位置。Array
示例
基本用法
与多维数组一起使用
使用更大 clear_depth 的示例
arrayEnumerateUniq
自 v1.1 起提供
返回一个与源数组大小相同的数组,其中每个元素表示源数组中对应元素在所有相同值元素中的位置。
在使用 ARRAY JOIN 和对数组元素进行聚合时,此函数非常有用。
该函数可以接受多个大小相同的数组作为参数。在这种情况下,唯一性是基于所有数组中相同位置元素所组成的元组来确定的。
语法
参数
arr1— 要处理的第一个数组。Array(T)arr2, ...— 可选。用于确定元组唯一性的、与arr1具有相同大小的其他数组。Array(UInt32)
返回值
返回一个数组,其中每个元素表示其在所有具有相同值或元组的元素中的位置。Array(T)
示例
基本用法
多个数组
ARRAY JOIN 聚合
arrayEnumerateUniqRanked
自 v20.1 引入
返回一个与源数组具有相同维度的一维或多维数组, 对每个元素给出其在所有相同值元素中的位置。 它支持对多维数组进行枚举,并且可以指定在数组中枚举的深度。
语法
参数
clear_depth— 在指定层级分别枚举元素。为不大于max_arr_depth的正整数。UInt*arr— 要枚举的 N 维数组。Array(T)max_array_depth— 最大生效深度。为不大于arr深度的正整数。UInt*
返回值
返回一个与 arr 具有相同大小的 N 维数组,其中每个元素表示该元素在所有相同值元素中的位置。Array(T)
示例
示例 1
示例 2
示例 3
示例 4
arrayExcept
自 v25.9 版本引入
返回一个数组,其中包含 source 中在 except 中不存在的元素,并保留其原始顺序。
该函数对两个数组执行差集运算。对于 source 中的每个元素,会检查该元素是否存在于 except 中(使用精确比较)。如果不存在,则该元素会被包含在结果中。
该操作具有以下特性:
- 保留
source中元素的顺序 - 如果
source中的重复元素在except中不存在,则这些重复元素会被保留 - 将 NULL 作为一个独立的值进行处理
语法
参数
返回值
返回与输入数组类型相同的数组,包含在 source 中但未在 except 中找到的元素。Array(T)
示例
基本示例
with_nulls1
with_nulls2
字符串
arrayExists
自 v1.1 起引入
如果在源数组中至少存在一个元素,使得 func(x[, y1, y2, ... yN]) 返回 true,则返回 1;否则返回 0。
语法
参数
func(x[, y1, ..., yN])— 一个作用于源数组 (x) 和条件数组 (y) 元素的 lambda 函数。Lambda functionsource_arr— 要处理的源数组。Array(T)[, cond1_arr, ... , condN_arr]— 可选。N 个条件数组,为 lambda 函数提供附加参数。Array(T)
返回值
如果 lambda 函数对至少一个元素返回 true,则返回 1,否则返回 0。UInt8
示例
使用示例
arrayFill
引入版本:v20.1
arrayFill 函数会从源数组的第一个元素开始,按顺序处理到最后一个元素,并在每个位置上使用源数组和条件数组中的元素,对一个 lambda 条件进行求值。当在位置 i 上该 lambda 函数的结果为 false 时,函数会将该元素替换为当前数组状态中位置 i-1 的元素。第一个元素始终会被保留,与任何条件无关。
语法
参数
func(x [, y1, ..., yN])— 一个 Lambda 函数func(x [, y1, y2, ... yN]) → F(x [, y1, y2, ... yN]),作用于源数组x和条件数组y的元素。Lambda functionsource_arr— 要处理的源数组。Lambda function[, cond1_arr, ... , condN_arr]— 可选。作为额外参数传递给 Lambda 函数的 N 个条件数组。Array(T)
返回值
返回一个数组 Array(T)
示例
单个数组示例
包含两个数组的示例
arrayFilter
自 v1.1 引入
返回一个数组,其中仅包含源数组中使 lambda 函数返回 true 的元素。
语法
参数
func(x[, y1, ..., yN])— 一个对源数组 (x) 和条件数组 (y) 的元素进行操作的 Lambda 函数。Lambda functionsource_arr— 要处理的源数组。Array(T)[, cond1_arr, ... , condN_arr]— 可选。为 Lambda 函数提供额外参数的 N 个条件数组。Array(T)
返回值
返回源数组的一个子集,类型为 Array(T)
示例
示例 1
示例 2
arrayFirst
自 v1.1 起引入
返回源数组中第一个使 func(x[, y1, y2, ... yN]) 返回 true 的元素,否则返回默认值。
语法
参数
func(x[, y1, ..., yN])— 对源数组(x)和条件数组(y)的元素进行操作的 Lambda 函数。Lambda 函数。-source_arr— 要处理的源数组。Array(T)。-[, cond1_arr, ... , condN_arr]— 可选。作为附加参数传递给 Lambda 函数的 N 个条件数组。Array(T)。
返回值
返回源数组中使 λ 结果为 true 的第一个元素,否则返回类型 T 的默认值。
示例
用法示例
无匹配结果
arrayFirstIndex
自 v1.1 引入
返回源数组中第一个使 func(x[, y1, y2, ... yN]) 返回 true 的元素的索引;如果不存在,则返回 '0'。
语法
参数
func(x[, y1, ..., yN])— 作用于源数组 (x) 及条件数组 (y) 元素的 lambda 函数。Lambda function。-source_arr— 要处理的源数组。Array(T)。-[, cond1_arr, ... , condN_arr]— 可选。作为附加参数传递给 lambda 函数的 N 个条件数组。Array(T)。
返回值
返回使 func 为 true 的源数组第一个元素的索引,否则返回 0。UInt32
示例
用法示例
无匹配结果
arrayFirstOrNull
自 v1.1 引入
返回源数组中第一个使 func(x[, y1, y2, ... yN]) 返回 true 的元素,否则返回 NULL。
语法
参数
func(x[, y1, ..., yN])— 一个用于对源数组 (x) 和条件数组 (y) 的元素进行操作的 lambda 函数。Lambda functionsource_arr— 要处理的源数组。Array(T)[, cond1_arr, ... , condN_arr]— 可选。提供给 lambda 函数的 N 个条件数组,作为附加参数。Array(T)
返回值
返回使 func 为 true 的源数组中的第一个元素,否则返回 NULL。
示例
用法示例
无匹配结果
arrayFlatten
自 v20.1 引入
将嵌套数组转换为扁平数组(一维数组)。
函数:
- 适用于任意深度的嵌套数组。
- 不会改变已经是扁平结构的数组。
扁平化后的数组包含所有源数组中的全部元素。
语法
别名: flatten
参数
arr— 多维数组。Array(Array(T))
返回值
将多维数组扁平化后返回一维数组 Array(T)
示例
用法示例
arrayFold
自 v23.10 引入
将一个 lambda 函数应用于一个或多个等长数组,并将结果累积到一个累加器中。
语法
参数
λ(x, x1 [, x2, x3, ... xN])— 形式为λ(acc, x1 [, x2, x3, ... xN]) → F(acc, x1 [, x2, x3, ... xN])的 lambda 函数,其中F是应用于acc和来自x的数组值的操作,其结果会再次作为acc参与后续计算。Lambda functionarr1 [, arr2, arr3, ... arrN]— 要进行运算的 N 个数组。Array(T)acc— 累加器值,其类型与该 Lambda 函数的返回类型相同。
返回值
返回最终的 acc 值。
示例
用法示例
斐波那契数列
多数组示例
arrayIntersect
自 v1.1 起引入
接收多个数组,并返回一个数组,其中包含在所有源数组中都出现的元素。结果仅包含唯一值。
语法
参数
arrN— 用于构造新数组的 N 个数组。Array(T)。
返回值
返回一个数组,包含所有 N 个数组中共有的不重复元素。Array(T)
示例
使用示例
arrayJaccardIndex
引入于:v23.7
返回两个数组的 Jaccard 指数。
语法
参数
返回值
返回 arr_x 和 arr_y 的 Jaccard 指数。Float64
示例
使用示例
arrayJoin
引入版本:v1.1
arrayJoin 函数接收一行包含数组的记录,并将该数组展开,为数组中的每个元素生成一行。
这与 ClickHouse 中的常规函数不同,常规函数是在同一行内将输入值映射为输出值,
而聚合函数则对一组行进行“压缩”或“归约”,将其变为单个汇总行
(或在与 GROUP BY 一起使用时变为汇总行中的单个值)。
除了应用此函数的列以外,所有列中的值都会被原样复制; 在该列中,这些值会被对应的数组元素所替换。
语法
参数
arr— 要展开的数组。Array(T)
返回值
返回由 arr 展开的行集。
示例
基本用法
arrayJoin 会影响查询的所有部分
同时使用多个 arrayJoin 函数
优化导致的意外结果
使用 ARRAY JOIN 语法
使用元组
arrayLast
自 v1.1 引入
返回源数组中最后一个使 lambda func(x [, y1, y2, ... yN]) 返回 true 的元素,否则返回默认值。
语法
参数
func(x[, y1, ..., yN])— 一个作用于源数组 (x) 及条件数组 (y) 元素的 Lambda 函数。Lambda 函数。-source— 要处理的源数组。Array(T)。-[, cond1, ... , condN]— 可选。提供给 Lambda 函数的 N 个条件数组,作为附加参数。Array(T)。
返回值
返回源数组中使 func 为 true 的最后一个元素,否则返回类型 T 的默认值。
示例
使用示例
未找到匹配项
arrayLastIndex
自 v1.1 引入
返回源数组中最后一个使 func(x[, y1, y2, ... yN]) 返回 true 的元素的索引,否则返回 0。
语法
参数
func(x[, y1, ..., yN])— 一个作用于源数组 (x) 和条件数组 (y) 元素的 lambda 函数。Lambda functionsource_arr— 要处理的源数组。Array(T)[, cond1_arr, ... , condN_arr]— 可选。N 个条件数组,作为传递给 lambda 函数的附加参数。Array(T)
返回值
返回使 func 返回 true 的源数组中最后一个元素的索引,否则返回 0 UInt32
示例
用法示例
无匹配结果
arrayLastOrNull
引入版本:v1.1
返回源数组中最后一个使得 lambda func(x [, y1, y2, ... yN]) 返回 true 的元素,如果不存在这样的元素,则返回 NULL。
语法
参数
func(x [, y1, ..., yN])— 作用于源数组 (x) 和条件数组 (y) 元素的 lambda 函数。Lambda 函数。source_arr— 要处理的源数组。Array(T)。[, cond1_arr, ... , condN_arr]— 可选。提供给 lambda 函数的 N 个条件数组,作为额外参数。Array(T)。
返回值
返回源数组中最后一个不满足 λ 条件的元素,否则返回 NULL。
示例
用法示例
无匹配结果
arrayLevenshteinDistance
自 v25.4 引入
计算两个数组之间的 Levenshtein 距离。
语法
参数
返回值
第一个数组与第二个数组之间的 Levenshtein 距离。Float64
示例
使用示例
arrayLevenshteinDistanceWeighted
自 v25.4 版本引入
计算两个数组的 Levenshtein 距离,并为每个元素使用自定义权重。 数组的元素数量应与其对应的权重数量一致。
语法
参数
from— 第一个数组。Array(T)。 -to— 第二个数组。Array(T)。 -from_weights— 第一个数组中各元素的权重。Array((U)Int*|Float*)to_weights— 第二个数组中各元素的权重。Array((U)Int*|Float*)
返回值
第一个数组和第二个数组之间的 Levenshtein 距离,并对每个元素应用自定义权重。Float64
示例
用法示例
arrayMap
自 v1.1 引入
通过对原始数组中的每个元素应用 lambda 函数,返回得到的新数组。
语法
参数
func— 一个对源数组 (x) 和条件数组 (y) 的元素进行操作的 Lambda 函数。Lambda functionarr— 要处理的 N 个数组。Array(T)
返回值
返回由 Lambda 函数结果组成的数组。Array(T)
示例
用法示例
从不同数组的元素创建元组
arrayMax
自 v21.1 引入
返回源数组中的最大元素。
如果指定了 lambda 函数 func,则返回该 lambda 函数结果中的最大元素。
语法
参数
func(x[, y1, ..., yN])— 可选。对源数组 (x) 和条件数组 (y) 的元素进行操作的 Lambda 函数。Lambda functionsource_arr— 要处理的源数组。Array(T)[, cond1_arr, ... , condN_arr]— 可选。作为附加参数传递给 Lambda 函数的 N 个条件数组。Array(T)
返回值
返回源数组中的最大元素;如果提供了 Lambda 函数,则返回其结果中的最大元素。
示例
基本示例
与 Lambda 函数配合使用
arrayMin
自 v21.1 引入
返回源数组中的最小元素。
如果指定了 lambda 函数 func,则返回该 lambda 函数结果中的最小元素。
语法
参数
func(x[, y1, ..., yN])— 可选。对源数组 (x) 和条件数组 (y) 的元素进行操作的 Lambda 函数。Lambda functionsource_arr— 要处理的源数组。Array(T)cond1_arr, ...— 可选。N 个条件数组,为 Lambda 函数提供额外参数。Array(T)
返回值
返回源数组中的最小元素;如果提供了 Lambda 函数,则返回其结果中的最小元素。
示例
基本示例
与 Lambda 函数配合使用
arrayNormalizedGini
引入自:v25.1
计算归一化 Gini 系数。
语法
参数
返回值
返回一个元组,包含预测值的 Gini 系数、归一化值的 Gini 系数,以及归一化 Gini 系数(= 前两个 Gini 系数的比值)。Tuple(Float64, Float64, Float64)
示例
用法示例
arrayPartialReverseSort
自 v23.2 版本引入
此函数与 arrayReverseSort 相同,只是额外接受一个 limit 参数,用于进行部分排序。
若只需保留排序后的元素,请使用 arrayResize。
语法
参数
f(arr[, arr1, ... ,arrN])— 应用于数组x各元素的 Lambda 函数。Lambda functionarr— 要排序的数组。Array(T)arr1, ... ,arrN— 当f接受多个参数时使用的 N 个额外数组。Array(T)limit— 执行排序的索引上限值。(U)Int*
返回值
返回一个与原数组大小相同的数组,其中区间 [1..limit] 内的元素按降序排序。
其余元素(区间 (limit..N])的顺序未指定。
示例
simple_int
simple_string
retain_sorted
lambda_simple
lambda_complex
arrayPartialShuffle
引入于:v23.2
返回一个与原数组长度相同的数组,其中区间 [1..limit] 内的元素是从原数组中随机选取的一个子集。剩余的 (limit..n] 区间将以未定义的顺序包含不在 [1..limit] 区间内的其他元素。
limit 的取值范围为 [1..n]。超出该范围的取值等价于执行完整的 arrayShuffle:
语法
参数
arr— 要进行洗牌的数组。Array(T)seed— 可选。用于随机数生成的种子。如果未提供,则会使用一个随机种子。(U)Int*limit— 可选。用于限制元素交换次数的数值,范围为[1..N]。(U)Int*
返回值
元素被部分打乱顺序的数组。Array(T)
示例
no_limit1
no_limit2
random_seed
explicit_seed
物化
arrayPartialSort
引入版本:v23.2
此函数与 arraySort 相同,但增加了一个 limit 参数,用于只对部分元素进行排序。
若只想保留排序后的元素,请使用 arrayResize。
语法
参数
f(arr[, arr1, ... ,arrN])— 应用于数组x各元素的 Lambda 函数。Lambda functionarr— 要排序的数组。Array(T)arr1, ... ,arrN— 当f接受多个参数时使用的 N 个附加数组。Array(T)limit— 进行排序的索引上限值。(U)Int*
返回值
返回一个与原数组大小相同的数组,其中区间 [1..limit] 中的元素按升序排序。其余索引在区间 (limit..N] 内的元素顺序不保证。
示例
simple_int
simple_string
retain_sorted
lambda_simple
lambda_complex
arrayPopBack
自 v1.1 起引入
从数组中移除最后一个元素。
语法
参数
arr— 要从中移除最后一个元素的数组。Array(T)
返回值
返回一个与 arr 相同的数组,但不包含其最后一个元素。Array(T)
示例
用法示例
arrayPopFront
自 v1.1 版本引入
从数组中移除第一个元素。
语法
参数
arr— 要删除第一个元素的数组。Array(T)
返回值
返回一个与 arr 相同的数组,但不包含其第一个元素。Array(T)
示例
用法示例
arrayProduct
引入版本:v21.1
返回源数组中各元素的乘积。
如果指定了 lambda 函数 func,则返回该 lambda 函数结果数组中各元素的乘积。
语法
参数
func(x[, y1, ..., yN])— 可选。对源数组 (x) 及条件数组 (y) 的元素进行操作的 lambda 函数。Lambda 函数source_arr— 要处理的源数组。Array(T)[, cond1_arr, ... , condN_arr]— 可选。传递给 lambda 函数的 N 个条件数组,用作额外参数。Array(T)
返回值
返回源数组中各元素的乘积;如果提供了 lambda 函数,则返回其结果各元素的乘积。Float64
示例
基础示例
与 Lambda 函数配合使用
arrayPushBack
引入版本:v1.1
在数组末尾追加一个元素。
语法
参数
- 只能向数值数组中添加数值,且只能向字符串数组中添加字符串。
- 在添加数值时,ClickHouse 会根据数组的数据类型自动设置
x的类型。 - 可以为
NULL。函数会向数组中添加一个NULL元素,并将数组元素的类型转换为Nullable。
有关 ClickHouse 中数据类型的更多信息,请参阅 数据类型。
返回值
返回一个与 arr 相同的数组,但在数组末尾追加了一个值 x Array(T)
示例
用法示例
arrayPushFront
自 v1.1 引入
在数组开头添加一个元素。
语法
参数
- 只能向数值数组中添加数值,且只能向字符串数组中添加字符串。
- 添加数值时,ClickHouse 会自动将
x的类型设置为该数组的数据类型。 - 可以为
NULL。该函数会向数组添加一个NULL元素,并将数组元素类型转换为Nullable。
有关 ClickHouse 中数据类型的更多信息,参见数据类型。
返回值
返回一个与 arr 相同的数组,但在数组开头额外多了一个值 x。Array(T)
示例
用法示例
arrayROCAUC
引入版本:v20.4
计算接收者操作特征(ROC)曲线下面积。 ROC 曲线是通过在所有阈值下,以真正例率(TPR)为纵轴、假正例率(FPR)为横轴绘制得到的。 结果数值范围为 0 到 1,数值越高表示模型性能越好。
ROC AUC(也常被简称为 AUC)是机器学习中的一个概念。 更多详情请参阅此处、此处以及此处。
语法
别名: arrayAUC
参数
scores— 预测模型给出的得分。Array((U)Int*)或Array(Float*)labels— 样本的标签,通常正样本为 1,负样本为 0。Array((U)Int*)或Enumscale— 可选。决定是否返回归一化后的面积。如果为 false,则返回 TP(真阳性)- FP(假阳性)曲线下的面积。默认值:true。Boolpartial_offsets—- 一个由四个非负整数组成的数组,用于计算 ROC 曲线下的局部面积(等价于 ROC 空间中的一条垂直带),而不是整个 AUC。此选项对 ROC AUC 的分布式计算非常有用。该数组必须包含以下元素 [
higher_partitions_tp,higher_partitions_fp,total_positives,total_negatives]。非负 整数 的 Array。可选。higher_partitions_tp: 高得分分区中正标签的数量。higher_partitions_fp: 高得分分区中负标签的数量。total_positives: 整个数据集中正样本的总数。total_negatives: 整个数据集中负样本的总数。
当使用 arr_partial_offsets 时,arr_scores 和 arr_labels 应仅为整个数据集的一个分区,且包含某一得分区间内的数据。
数据集应被划分为连续的分区,每个分区包含得分落在特定范围内的数据子集。
例如:
- 一个分区可以包含区间 [0, 0.5) 内的所有得分。
- 另一个分区可以包含区间 [0.5, 1.0] 内的得分。
返回值
返回 ROC(受试者工作特征)曲线下的面积。Float64
示例
使用示例
arrayRandomSample
自 v23.10 版本引入
返回由输入数组中 samples 个随机元素组成的子集。如果 samples 大于输入数组的大小,则样本大小会被限制为数组大小,即会返回数组中的所有元素,但不保证其顺序。该函数既可以处理一维数组,也可以处理嵌套数组。
语法
参数
返回值
一个数组,包含从输入数组中随机抽取的元素样本。Array(T)
示例
用法示例
使用多维数组
arrayReduce
自 v1.1 引入
对数组元素执行聚合函数计算,并返回结果。
聚合函数的名称以单引号括起来的字符串形式传入,例如 'max'、'sum'。
使用参数化聚合函数时,在函数名后通过括号指定参数,例如 'uniqUpTo(6)'。
语法
参数
返回值
返回聚合函数的结果。
示例
使用示例
使用多参数聚合函数的示例
参数化聚合函数示例
arrayReduceInRanges
自 v20.4 引入
对给定区间内的数组元素应用聚合函数,并返回一个数组,其中包含每个区间对应的结果。
该函数返回的结果与对每个区间分别调用多次 arrayReduce(agg_func, arraySlice(arr1, index, length), ...) 所得到的结果相同。
语法
参数
agg_f— 要使用的聚合函数名称。Stringranges— 要执行聚合的范围。为一个由元组(i, r)组成的数组,其中i为开始聚合的索引,r为要聚合的范围。Array(T)或Tuple(T)arr1 [, arr2, ... ,arrN)]— 作为聚合函数参数的 N 个数组。Array(T)
返回值
返回一个数组,其中包含在指定范围内执行聚合函数所得的结果。Array(T)
示例
用法示例
arrayRemove
自 v25.11 引入
从数组中删除所有与给定值相等的元素。 NULL 也被视为相等。
语法
别名: array_remove
参数
arr— Array(T),elem— T
返回值
返回源数组 Array(T) 的子集
示例
示例 1
示例 2
arrayResize
在 v1.1 中引入
修改数组长度。
语法
参数
arr— 要调整大小的数组。Array(T)size— 数组的新长度。 如果size小于数组的原始长度,则从右侧截断数组。 如果size大于数组的原始长度,则从右侧使用extender值或数组元素数据类型的默认值进行扩展。extender— 用于扩展数组的值。可以为NULL。
返回值
长度为 size 的数组。Array(T)
示例
示例 1
示例 2
arrayReverse
自 v1.1 引入
将给定数组中的元素顺序反转。
函数 reverse(arr) 具有相同的功能,但除了数组之外,还适用于其他数据类型。
语法
参数
arr— 要反转顺序的数组。Array(T)
返回值
返回一个与原数组大小相同的数组,其中元素顺序被反转。Array(T)
示例
用法示例
arrayReverseFill
引入版本:v20.1
arrayReverseFill 函数从源数组的最后一个元素开始依次处理到第一个元素,在每个位置上使用源数组和条件数组中的元素来对一个 lambda 表达式进行求值。当该条件在位置 i 上的结果为 false 时,函数会将该元素替换为当前数组状态下位置 i+1 的元素。无论条件如何,最后一个元素始终会被保留。
语法
参数
func(x[, y1, ..., yN])— 一个对源数组 (x) 和条件数组 (y) 的元素进行操作的 lambda 函数。Lambda functionsource_arr— 要处理的源数组。Array(T)[, cond1_arr, ... , condN_arr]— 可选。提供给 lambda 函数作为额外参数的 N 个条件数组。Array(T)
返回值
返回一个数组,其中源数组的元素被 lambda 函数的结果替换。Array(T)
示例
使用单个数组的示例
两个数组示例
arrayReverseSort
引入版本:v1.1
按降序对数组元素进行排序。
如果指定了函数 f,则会根据该函数应用于数组元素的结果对输入数组进行排序,然后再将排序后的数组反转。
如果 f 接受多个参数,则会向 arrayReverseSort 函数传入多个数组,这些数组将分别对应 func 的各个参数。
如果待排序的数组包含 -Inf、NULL、NaN 或 Inf,它们将按以下顺序排序:
-InfInfNaNNULL
arrayReverseSort 是一个高阶函数。
语法
参数
f(y1[, y2 ... yN])— 要应用于数组x元素的 lambda 函数。arr— 要排序的数组。Array(T)arr1, ..., yN— 可选。当f接受多个参数时传入的 N 个附加数组。
返回值
如果未提供 lambda 函数,则返回按降序排序的数组 x;否则,先根据所提供的 lambda 函数的逻辑进行排序,然后将结果反转后的数组。Array(T)。
示例
示例 1
示例 2
arrayReverseSplit
引入版本:v20.1
将源数组拆分为多个数组。当 func(x[, y1, ..., yN]) 返回非零值时,数组会在该元素的右侧进行拆分。数组不会在最后一个元素之后被拆分。
语法
参数
func(x[, y1, ..., yN])— 对源数组 (x) 和条件数组 (y) 的元素进行操作的 lambda 函数。Lambda functionsource_arr— 要处理的源数组。Lambda function[, cond1_arr, ... , condN_arr]— 可选。N 个条件数组,为 lambda 函数提供额外参数。Array(T)
返回值
返回一个数组的数组。Array(Array(T))
示例
用法示例
arrayRotateLeft
引入版本:v23.8
将数组按指定的元素个数向左旋转。n 为负值时,等价于按其绝对值向右旋转。
语法
参数
arr— 要进行元素旋转的数组。Array(T)。-n— 要旋转的元素个数。(U)Int8/16/32/64。
返回值
向左旋转指定数量元素后得到的数组 Array(T)。
示例
用法示例
n 的负值
arrayRotateRight
引入于:v23.8
将数组向右旋转指定数量的元素。n 的负值被视为按其绝对值个元素向左旋转。
语法
参数
arr— 要进行元素旋转的数组。Array(T)。 -n— 需要旋转的元素个数。(U)Int8/16/32/64。
返回值
向右旋转指定数量元素后的数组 Array(T)
示例
用法示例
n 的负值
arrayShiftLeft
自 v23.8 起引入
将数组左移指定数量的元素。 新填充的元素使用提供的参数或数组元素类型的默认值。 如果该数量为负数,则将数组右移。
语法
参数
arr— 要进行元素移位的数组。Array(T)n— 要移位的元素数量。(U)Int8/16/32/64default— 可选。新元素的默认值。
返回值
一个向左移位指定数量元素的数组 Array(T)
示例
使用示例
n 为负数
使用默认值
arrayShiftRight
引入自:v23.8
将数组向右移位指定数量的元素。 新元素使用提供的参数或数组元素类型的默认值进行填充。 如果元素数量为负值,数组将向左移位。
语法
参数
arr— 要进行元素移位的数组。Array(T)n— 向右移位的元素个数。(U)Int8/16/32/64default— 可选。新元素的默认值。
返回值
一个按指定元素个数向右移位后的数组 Array(T)
示例
使用示例
n 的负值
使用默认值
arrayShingles
引入版本:v24.1
生成一个由 shingle 组成的数组(类似于字符串的 n-grams),即从输入数组中按指定长度提取的连续子数组。
语法
参数
返回值
生成的 shingle 数组。Array(T)
示例
用法示例
arrayShuffle
自 v23.2 起引入
返回一个与原数组大小相同的数组,其元素顺序被打乱。 元素会以一种方式重新排列,使得这些元素的每一种可能排列出现的概率都相同。
此函数不会将常量物化。
语法
参数
返回值
元素顺序被打乱的数组 Array(T)
示例
未指定 seed 的示例(结果不稳定)
未使用种子的示例(稳定结果)
arraySimilarity
引入版本:v25.4
基于加权 Levenshtein 距离计算两个数组的相似度,取值范围为 0 到 1。
语法
参数
from— 第一个数组Array(T)to— 第二个数组Array(T)from_weights— 第一个数组的权重Array((U)Int*|Float*)to_weights— 第二个数组的权重Array((U)Int*|Float*)
返回值
返回两个数组之间的相似度(基于加权 Levenshtein 距离),取值范围为 0 到 1,类型为 Float64
示例
使用示例
arraySlice
自 v1.1 起引入
返回数组的一个切片,其中包含 NULL 元素。
语法
参数
arr— 要进行切片的数组。Array(T)offset— 从数组边界起算的偏移量。正值表示从左侧开始的偏移,负值表示从右侧开始的偏移。数组元素的编号从1开始。(U)Int*length— 所需切片的长度。如果指定为负值,函数返回切片[offset, array_length - length]。如果省略该值,函数返回切片[offset, 数组末尾]。(U)Int*
返回值
返回从指定 offset 开始、长度为 length 的数组切片 Array(T)
示例
用法示例
arraySort
引入于:v1.1
对给定数组的元素按升序排序。
如果指定了 lambda 函数 f,则排序顺序由对数组中每个元素应用该 lambda 后得到的结果决定。
如果该 lambda 接受多个参数,则会向 arraySort 函数传入多个数组,这些数组将与 f 的各个参数一一对应。
如果要排序的数组包含 -Inf、NULL、NaN 或 Inf,它们将按照以下顺序排列:
-InfInfNaNNULL
arraySort 是一个高阶函数。
语法
参数
f(y1[, y2 ... yN])— 应用于数组x元素的 lambda 函数。-arr— 要排序的数组。Array(T)-arr1, ..., yN— 可选。当f接受多个参数时使用的 N 个附加数组。
返回值
如果未提供 lambda 函数,则返回按升序排序的数组 arr,否则返回根据所提供 lambda 函数逻辑排序的数组。Array(T)。
示例
示例 1
示例 2
示例 3
arraySplit
引入版本:v20.1
将源数组拆分为多个数组。当 func(x [, y1, ..., yN]) 返回非零值时,数组会在该元素的左侧进行拆分。数组不会在第一个元素之前进行拆分。
语法
参数
func(x[, y1, ..., yN])— 一个用于处理源数组 (x) 和条件数组 (y) 元素的 Lambda 函数。Lambda 函数。 -source_arr— 要拆分的源数组Array(T)。 -[, cond1_arr, ... , condN_arr]— 可选。作为传递给 Lambda 函数的附加参数的 N 个条件数组。Array(T)。
返回值
返回一个由数组组成的数组 Array(Array(T))
示例
用法示例
arraySum
自 v21.1 引入
返回源数组中各元素的总和。
如果指定了 lambda 函数 func,则返回对数组元素应用该 lambda 后所得结果的总和。
语法
参数
func(x[, y1, ..., yN])— 可选。一个对源数组 (x) 及条件数组 (y) 的元素进行操作的 Lambda 函数。Lambda functionsource_arr— 要处理的源数组。Array(T), cond1_arr, ... , condN_arr]— 可选。N 个条件数组,为 Lambda 函数提供额外参数。Array(T)
返回值
返回源数组中元素的总和;如果提供了 Lambda 函数,则返回该函数结果中各元素的总和。
示例
基本示例
与 Lambda 函数配合使用
arraySymmetricDifference
引入版本:v25.4
接受多个数组作为输入,并返回一个数组,其中包含未同时出现在所有源数组中的元素。结果仅包含不重复的值。
多于两个集合 的对称差 在数学上的定义
是由所有在奇数个输入集合中出现的输入元素构成的集合。
相比之下,函数 arraySymmetricDifference 仅返回所有未在所有输入集合中同时出现的输入元素构成的集合。
语法
参数
arrN— 用于构造新数组的 N 个数组。Array(T)。
返回值
返回一个数组,包含未在所有源数组中同时出现的唯一元素。Array(T)
示例
使用示例
arrayUnion
自 v24.10 引入
接收多个数组作为参数,并返回一个数组,该数组包含所有源数组中出现过的元素。结果中仅包含不重复的元素。
语法
参数
arrN— 用于构造新数组的 N 个数组。Array(T)
返回值
返回一个由源数组中所有不重复元素组成的新数组(Array(T))。
示例
用法示例
arrayUniq
引入版本:v1.1
对于传入的单个参数,统计数组中不同元素的数量。 对于传入的多个参数,它会统计由多个数组中相同位置元素组成的不同元组的数量。
例如,SELECT arrayUniq([1,2], [3,4], [5,6]) 会形成如下元组:
- 位置 1: (1,3,5)
- 位置 2: (2,4,6)
然后会统计唯一元组的数量。本例中为 2。
所有传入的数组必须具有相同的长度。
如果需要获得数组中唯一元素的列表,可以使用 arrayReduce('groupUniqArray', arr)。
语法
参数
返回值
对于单个参数,返回唯一元素的数量。对于多个参数,返回由多个数组中对应位置元素组成的唯一元组的数量。
UInt32
示例
单个参数
多个参数
arrayWithConstant
在 v20.1 版本中引入
创建一个长度为 length,且所有元素都为常量 x 的数组。
语法
参数
length— 数组中的元素个数。(U)Int*x— 数组中N个元素的值,可以是任意类型。
返回值
返回一个包含 N 个元素、且每个元素的值为 x 的数组。Array(T)
示例
用法示例
arrayZip
自 v20.1 引入
将多个数组组合为单个数组。结果数组包含源数组中对应位置的元素,这些元素按照参数列出的顺序被分组为元组。
语法
参数
arr1, arr2, ... , arrN— 要合并成单个数组的 N 个数组。Array(T)
返回值
返回一个数组,其中的元素是由源数组按位置组合成的元组。元组中的数据类型与输入数组的类型相同,且顺序与数组的传入顺序一致。Array(T)
示例
用法示例
arrayZipUnaligned
自 v20.1 引入
将多个数组组合为一个数组,支持未对齐的数组(长度不同的数组)。结果数组包含源数组中对应位置的元素,并按参数列出的顺序将这些元素分组为元组。
语法
参数
arr1, arr2, ..., arrN— 要合并成一个数组的 N 个数组。Array(T)
返回值
返回一个数组,其元素为将源数组的元素分组后得到的元组。元组中的数据类型与输入数组的数据类型相同,且顺序与传入数组的顺序一致。Array(T) 或 Tuple(T1, T2, ...)
示例
使用示例
countEqual
自 v1.1 引入
返回数组中等于 x 的元素数量。等价于 arrayCount(elem -> elem = x, arr)。
将 NULL 元素视为独立的值进行处理。
语法
参数
arr— 要搜索的数组。Array(T)x— 要在数组中统计的值。任意类型。
返回值
返回数组中等于 x 的元素数量。类型为 UInt64
示例
用法示例
empty
引入于:v1.1
检查输入数组是否为空。
如果数组不包含任何元素,则被视为空数组。
可以通过启用 optimize_functions_to_subcolumns 设置来优化。将 optimize_functions_to_subcolumns 设置为 1 时,该函数只读取 size0 子列,而无需读取并处理整个数组列。查询 SELECT empty(arr) FROM TABLE; 会被转换为 SELECT arr.size0 = 0 FROM TABLE;。
该函数同样适用于 String 或 UUID 类型。
语法
参数
arr— 输入数组。Array(T)
返回值
如果数组为空则返回 1,如果数组非空则返回 0,类型为 UInt8
示例
使用示例
emptyArrayDate
引入版本:v1.1
返回空的 Date 数组
语法
参数
- 无。
返回值
空的 Date 数组。Array(T)
示例
使用示例
emptyArrayDateTime
自 v1.1 引入
返回一个空的 DateTime 数组
语法
参数
- 无。
返回值
空 DateTime 数组。Array(T)
示例
用法示例
emptyArrayFloat32
在 v1.1 中引入
返回一个空的 Float32 数组
语法
参数
- 无。
返回值
空的 Float32 数组。Array(T)
示例
使用示例
emptyArrayFloat64
自 v1.1 起提供
返回一个空的 Float64 数组
语法
参数
- 无。
返回值
空的 Float64 数组。Array(T)
示例
用法示例
emptyArrayInt16
自 v1.1 引入
返回一个空的 Int16 数组
语法
参数
- 无。
返回值
空的 Int16 数组。Array(T)
示例
使用示例
emptyArrayInt32
引入于:v1.1
返回一个空的 Int32 数组
语法
参数
- 无。
返回值
空的 Int32 数组。Array(T)
示例
使用示例
emptyArrayInt64
自 v1.1 版本引入
返回一个空的 Int64 数组。
语法
参数
- 无。
返回值
一个 Int64 类型的空数组。Array(T)
示例
使用示例
emptyArrayInt8
引入于:v1.1
返回一个空的 Int8 数组
语法
参数
- 无。
返回值
返回一个空的 Int8 数组。Array(T)
示例
使用示例
emptyArrayString
自 v1.1 起引入
返回一个空字符串数组
语法
参数
- 无。
返回值
一个空的 String 数组。Array(T)
示例
使用示例
emptyArrayToSingle
自 v1.1 引入
接受一个空数组,并返回一个仅包含一个元素的数组,该元素等于默认值。
语法
参数
arr— 一个空数组。Array(T)
返回值
一个仅包含单个元素的数组,其元素为该数组元素类型的默认值。Array(T)
示例
基本示例
emptyArrayUInt16
引入于:v1.1
返回一个空的 UInt16 数组
语法
参数
- 无。
返回值
一个空的 UInt16 数组。Array(T)
示例
使用示例
emptyArrayUInt32
首次引入于:v1.1
返回一个空的 UInt32 类型数组
语法
参数
- 无。
返回值
空的 UInt32 数组。Array(T)
示例
用法示例
emptyArrayUInt64
引入版本:v1.1
返回一个空的 UInt64 数组
语法
参数
- 无。
返回值
空的 UInt64 数组。Array(T)
示例
使用示例
emptyArrayUInt8
自 v1.1 版本起引入
返回一个空的 UInt8 数组
语法
参数
- 无。
返回值
空的 UInt8 数组。Array(T)
示例
使用示例
has
引入版本:v1.1
返回数组是否包含指定的元素。
语法
参数
arr— 源数组。Array(T)x— 要在数组中搜索的值。
返回值
如果数组包含指定元素则返回 1,否则返回 0。UInt8
示例
基本用法
未找到
hasAll
自 v1.1 引入
检查一个数组是否为另一个数组的子集。
- 空数组是任何数组的子集。
Null会作为普通值进行处理。- 两个数组中元素的顺序无关紧要。
语法
参数
返回值
- 如果
set包含subset的所有元素,则返回1。 - 否则返回
0。
如果 set 与 subset 中的元素没有共同的超类型,则抛出 NO_COMMON_TYPE 异常。
示例
空数组
含有 NULL 值的数组
包含不同类型元素的数组
包含 String 类型值的数组
没有共同类型的数组
数组的数组(嵌套数组)
hasAny
引入于:v1.1
检查两个数组是否存在相同元素(是否有交集)。
Null会被当作普通值处理。- 两个数组中元素的顺序不会影响结果。
语法
参数
返回值
- 如果
arr_x和arr_y至少有一个相同元素,则为1。 - 否则为
0。
如果两个数组中存在元素对之间不具有共同超类型,则会抛出 NO_COMMON_TYPE 异常。
示例
一个数组为空
包含 NULL 值的数组
包含不同类型元素的数组
没有共同类型的数组
数组的数组
hasSubstr
引入于:v20.6
检查 array2 的所有元素是否以完全相同的顺序出现在 array1 中。
因此,当且仅当 array1 = prefix + array2 + suffix 时,该函数返回 1。
换句话说,该函数会像 hasAll 函数一样检查 array1 中是否包含 array2 的所有元素。
此外,它还会检查 array1 和 array2 中元素出现的顺序是否一致。
- 如果
array2为空,函数返回1。 Null会作为一个值进行处理。换句话说,hasSubstr([1, 2, NULL, 3, 4], [2,3])将返回0。然而,hasSubstr([1, 2, NULL, 3, 4], [2,NULL,3])将返回1。- 两个数组中值的顺序会影响结果。
如果两个数组中的任意元素没有共享公共超类型,则抛出 NO_COMMON_TYPE 异常。
语法
参数
返回值
如果数组 arr1 包含数组 arr2,则返回 1,否则返回 0。UInt8
示例
两个数组都为空
包含 NULL 值的数组
包含不同类型值的数组
字符串数组
可有效排序的数组
具有无效排序的数组
数组的数组
没有共同类型的数组
indexOf
引入版本:v1.1
如果数组中存在值为 'x' 的元素,则返回第一个等于 'x' 的元素的索引(从 1 开始)。
如果数组不包含要查找的值,函数返回 0。
设置为 NULL 的元素会被当作普通值处理。
语法
参数
返回值
如果存在,返回 arr 中第一个 x 的索引(从 1 开始编号)。否则返回 0。UInt64
示例
基础示例
包含 NULL 值的数组
indexOfAssumeSorted
引入于:v24.12
如果数组中存在值为 'x' 的元素,则返回该元素第一次出现时的索引(从 1 开始计数)。
如果数组不包含要查找的值,则函数返回 0。
与 indexOf 函数不同,此函数假定数组按升序排序。
如果数组未排序,则结果未定义。
语法
参数
返回值
如果 arr 中存在 x,则返回第一个 x 的索引(从 1 开始编号)。否则,返回 0。UInt64
示例
基础示例
length
引入版本:v1.1
计算字符串或数组的长度。
- 对于 String 或 FixedString 参数:计算字符串中的字节数。
- 对于 Array 参数:计算数组中的元素个数。
- 如果应用于 FixedString 参数,该函数是一个常量表达式。
请注意,字符串中的字节数不同于 Unicode “code points”的数量,也不同于 Unicode “grapheme clusters”(通常所说的“字符”)的数量,也不同于字符串的可见宽度。
字符串中允许包含 ASCII 的 NULL 字节,这些字节也会被计入长度。
语法
别名: OCTET_LENGTH
参数
x— 要计算其字节数(对于 String/FixedString)或元素个数(对于 Array)的值。类型为String、FixedString或Array(T)
返回值
返回一个 UInt64 值,表示 String/FixedString x 中的字节数或数组 x 中的元素个数。
示例
String 示例
数组示例
constexpr 示例
Unicode 示例
ASCII_vs_UTF-8 示例
notEmpty
引入于:v1.1
检查输入数组是否非空。
如果数组至少包含一个元素,则被视为非空。
可以通过启用 optimize_functions_to_subcolumns 设置进行优化。设置 optimize_functions_to_subcolumns = 1 时,该函数只读取 size0 子列,而不是读取并处理整个数组列。查询 SELECT notEmpty(arr) FROM table 会被转换为 SELECT arr.size0 != 0 FROM TABLE。
该函数同样适用于字符串(String)或 UUID 类型。
语法
参数
arr— 输入数组。Array(T)
返回值
当数组非空时返回 1,当数组为空时返回 0。UInt8
示例
使用示例
range
引入于:v1.1
按 step 返回一个从 start 到 end - 1 的数字数组。
支持的类型为:
-
UInt8/16/32/64 -
Int8/16/32/64 -
所有参数
start、end、step必须是上述支持类型之一。返回数组的元素类型将是这些参数类型的超类型。 -
如果函数返回的数组总长度超过由设置
function_range_max_elements_in_block指定的元素数量,则抛出异常。 -
如果任一参数的类型为 Nullable(nothing),则返回
NULL。如果任一参数的值为NULL(Nullable(T) 类型),则抛出异常。
语法
参数
start— 可选。数组的第一个元素。如果使用了step,则必填。默认值:0。 -end— 必填。构造数组时的上界(不包含该值)。 -step— 可选。指定数组中相邻元素之间的递增步长。默认值:1。
返回值
从 start 到 end - 1,按 step 递增的数字数组。Array(T)
示例
用法示例
replicate
自 v1.1 起引入
创建仅包含单个值的数组。
语法
参数
返回值
返回一个与 arr 长度相同、全部由值 x 填充的数组。Array(T)
示例
用法示例
reverse
引入版本:v1.1
将输入数组的元素顺序或输入字符串的字符顺序反转。
语法
参数
返回值
返回一个数组或字符串,其元素或字符的顺序被反转。
示例
反转数组
字符串反转
距离函数
所有受支持的函数均在距离函数文档中有详细说明。