array_filter_doirs
功能描述
根据条件过滤数组元素,返回满足条件的元素组成的新数组。函数支持两种调用方式:使用 lambda 表达式的高阶函数形式,以及直接使用布尔数组的过滤形式。
语法
array_filter_doris(lambda, array1, ...)
array_filter_doris(array1, array<boolean> filter_array)
参数说明
lambda:lambda 表达式,用于对数组元素进行判断,返回 true/false 或可以转换为布尔值的表达式
array1, ...:一个或多个 ARRAY 类型参数
filter_array:ARRAY 类型,用于过滤的布尔数组
返回结果
返回类型:ARRAY
返回值含义:
- 返回满足过滤条件的所有元素组成的新数组
- NULL:如果输入数组为 NULL
- 空数组:如果没有元素满足条件
使用说明:
- lambda 形式:lambda 表达式参数个数需与数组参数个数一致
- 布尔数组形式:
array1 和 filter_array 的长度最好完全一致,如果布尔数组更长,多余的布尔值会被忽略;如果布尔数组更短,只处理布尔数组中对应位置的元素
- 支持对多数组、复杂类型数组进行过滤
- 空数组返回空数组,NULL 数组返回 NULL
- lambda 可以用任意标量表达式,不能用聚合函数
- 对数组元素中的 null 值:null 元素会传递给 lambda 表达式处理,lambda 可以判断 null 值
使用示例
CREATE TABLE array_filter_test (
id INT,
int_array ARRAY<INT>,
double_array ARRAY<DOUBLE>,
string_array ARRAY<STRING>
);
INSERT INTO array_filter_test VALUES
(1, [1, 2, 3, 4, 5], [1.1, 2.2, 3.3, 4.4, 5.5], ['a', 'bb', 'ccc', 'dddd', 'eeeee']),
(2, [10, 20, 30], [10.5, 20.5, 30.5], ['x', 'yy', 'zzz']),
(3, [], [], []),
(4, NULL, NULL, NULL);
- 使用 lambda 表达式过滤 double_array 中大于等于 3 的元素:
SELECT array_filter_doris(x -> x >= 3, double_array) FROM array_filter_test WHERE id = 1;

- 使用 lambda 表达式过滤 string_array 中长度大于 2 的元素
SELECT array_filter_doris(x -> length(x) > 2, string_array) FROM array_filter_test WHERE id = 1;

SELECT array_filter_doris(x -> x > 0, int_array) FROM array_filter_test WHERE id = 3;

- NULL 数组返回 NULL:当输入数组为 NULL 时返回 NULL,不会抛出错误
SELECT array_filter_doris(x -> x > 0, int_array) FROM array_filter_test WHERE id = 4;

- 包含 null 的数组,lambda 可判断 null
select array_filter_doris(x -> x is not null, [null, 1, null, 2, null]);

- 嵌套数组过滤,过滤每个子数组长度大于 2 的元素:
SELECT array_filter_doris(x -> size(x) > 2, [[1,2], [3,4,5], [6], [7,8,9,10]]);
