ClickHouse/docs/zh/sql-reference/functions/higher-order-functions.md

140 lines
5.2 KiB
Markdown
Raw Normal View History

2022-08-26 19:07:59 +00:00
---
slug: /zh/sql-reference/functions/higher-order-functions
---
# 高阶函数 {#gao-jie-han-shu}
2019-05-05 17:38:05 +00:00
## `->` 运算符, lambda(params, expr) 函数 {#yun-suan-fu-lambdaparams-expr-han-shu}
2019-05-05 17:38:05 +00:00
用于描述一个lambda函数用来传递给其他高阶函数。箭头的左侧有一个形式参数它可以是一个标识符或多个标识符所组成的元祖。箭头的右侧是一个表达式在这个表达式中可以使用形式参数列表中的任何一个标识符或表的任何一个列名。
示例: `x -> 2 * x, str -> str != Referer.`
高阶函数只能接受lambda函数作为其参数。
高阶函数可以接受多个参数的lambda函数作为其参数在这种情况下高阶函数需要同时传递几个长度相等的数组这些数组将被传递给lambda参数。
除了arrayMaparrayFilter以外的所有其他函数都可以省略第一个参数lambda函数。在这种情况下默认返回数组元素本身。
2019-05-05 17:38:05 +00:00
### arrayMap(func, arr1, ...) {#higher_order_functions-array-map}
2019-05-05 17:38:05 +00:00
将arr
将从func函数的原始应用程序获得的数组返回到arr数组中的每个元素。
返回从原始应用程序获得的数组 func 函数中的每个元素 arr 阵列。
2019-05-05 17:38:05 +00:00
### arrayFilter(func, arr1, ...) {#arrayfilterfunc-arr1}
2019-05-05 17:38:05 +00:00
返回一个仅包含以下元素的数组 arr1 对于哪个 func 返回0以外的内容。
2019-05-05 17:38:05 +00:00
示例:
``` sql
SELECT arrayFilter(x -> x LIKE '%World%', ['Hello', 'abc World']) AS res
```
┌─res───────────┐
│ ['abc World'] │
└───────────────┘
2019-05-05 17:38:05 +00:00
``` sql
SELECT
arrayFilter(
(i, x) -> x LIKE '%World%',
arrayEnumerate(arr),
['Hello', 'abc World'] AS arr)
AS res
```
┌─res─┐
│ [2] │
└─────┘
2019-05-05 17:38:05 +00:00
### arrayCount(\[func,\] arr1, ...) {#arraycountfunc-arr1}
2019-05-05 17:38:05 +00:00
返回数组arr中非零元素的数量如果指定了func则通过func的返回值确定元素是否为非零元素。
2019-05-05 17:38:05 +00:00
### arrayExists(\[func,\] arr1, ...) {#arrayexistsfunc-arr1}
2019-05-05 17:38:05 +00:00
返回数组arr中是否存在非零元素如果指定了func则使用func的返回值确定元素是否为非零元素。
2019-05-05 17:38:05 +00:00
### arrayAll(\[func,\] arr1, ...) {#arrayallfunc-arr1}
2019-05-05 17:38:05 +00:00
返回数组arr中是否存在为零的元素如果指定了func则使用func的返回值确定元素是否为零元素。
2019-05-05 17:38:05 +00:00
### arraySum(\[func,\] arr1, ...) {#arraysumfunc-arr1}
2019-05-05 17:38:05 +00:00
计算arr数组的总和如果指定了func则通过func的返回值计算数组的总和。
2019-05-05 17:38:05 +00:00
### arrayFirst(func, arr1, ...) {#arrayfirstfunc-arr1}
2019-05-05 17:38:05 +00:00
返回数组中第一个匹配的元素函数使用func匹配所有元素直到找到第一个匹配的元素。
2019-05-05 17:38:05 +00:00
### arrayFirstIndex(func, arr1, ...) {#arrayfirstindexfunc-arr1}
2019-05-05 17:38:05 +00:00
返回数组中第一个匹配的元素的下标索引函数使用func匹配所有元素直到找到第一个匹配的元素。
2019-05-05 17:38:05 +00:00
### arrayCumSum(\[func,\] arr1, ...) {#arraycumsumfunc-arr1}
2019-05-05 17:38:05 +00:00
返回源数组部分数据的总和,如果指定了`func`函数,则使用`func`的返回值计算总和。
示例:
``` sql
SELECT arrayCumSum([1, 1, 1, 1]) AS res
```
┌─res──────────┐
│ [1, 2, 3, 4] │
└──────────────┘
2019-05-05 17:38:05 +00:00
### arrayCumSumNonNegative(arr) {#arraycumsumnonnegativearr}
2019-05-05 17:38:05 +00:00
与arrayCumSum相同返回源数组部分数据的总和。不同于arrayCumSum当返回值包含小于零的值时该值替换为零后续计算使用零继续计算。例如
``` sql
SELECT arrayCumSumNonNegative([1, 1, -4, 1]) AS res
```
┌─res───────┐
│ [1,2,0,1] │
└───────────┘
2019-05-05 17:38:05 +00:00
### arraySort(\[func,\] arr1, ...) {#arraysortfunc-arr1}
2019-05-05 17:38:05 +00:00
返回升序排序`arr1`的结果。如果指定了`func`函数,则排序顺序由`func`的结果决定。
[Schwartzian变换](https://en.wikipedia.org/wiki/Schwartzian_transform)用于提高排序效率。
示例:
``` sql
SELECT arraySort((x, y) -> y, ['hello', 'world'], [2, 1]);
```
┌─res────────────────┐
│ ['world', 'hello'] │
└────────────────────┘
2019-05-05 17:38:05 +00:00
请注意NULL和NaN在最后NaN在NULL之前。例如
``` sql
SELECT arraySort([1, nan, 2, NULL, 3, nan, 4, NULL])
```
┌─arraySort([1, nan, 2, NULL, 3, nan, 4, NULL])─┐
│ [1,2,3,4,nan,nan,NULL,NULL] │
└───────────────────────────────────────────────┘
### arrayReverseSort(\[func,\] arr1, ...) {#arrayreversesortfunc-arr1}
2019-05-05 17:38:05 +00:00
返回降序排序`arr1`的结果。如果指定了`func`函数,则排序顺序由`func`的结果决定。
请注意NULL和NaN在最后NaN在NULL之前。例如
``` sql
SELECT arrayReverseSort([1, nan, 2, NULL, 3, nan, 4, NULL])
```
┌─arrayReverseSort([1, nan, 2, NULL, 3, nan, 4, NULL])─┐
│ [4,3,2,1,nan,nan,NULL,NULL] │
└──────────────────────────────────────────────────────┘