十二、clickhouse数组函数

-- 1.数组非空判断相关函数(真为1,假为0)

SELECT empty([]), empty([1,2,3]), notEmpty([1,2,3]), notEmpty([]);

 


-- 2.数组长度 length() 返回数组中的元素个数。 结果类型是UInt64。 该函数也适用于字符串。

SELECT
-- length(), -- 出现异常
-- length([true, false]), -- 异常
-- length([1,2,,4]), --出现异常!
length([]), -- 0
length(['a','b','c']), -- 3
length([1,2,3]); -- 3

 


-- 3.扩展判断非空的部分函数如下:不接受任何参数并返回适当类型的空数组

SELECT
emptyArrayUInt8(), -- UInt8的空数组
emptyArrayUInt16(),
emptyArrayUInt32(),
emptyArrayUInt64(),
emptyArrayDate(),
emptyArrayDateTime(),
emptyArrayInt8(),
emptyArrayInt16(),
emptyArrayInt32(),
emptyArrayInt64();
-- 接受一个空数组并返回一个仅包含一个默认值元素的数组。(以下是部分示例)
SELECT
emptyArrayToSingle(emptyArrayInt32()), -- 0
emptyArrayToSingle(emptyArrayUInt32()), -- 0
emptyArrayToSingle(emptyArrayDate()), -- 0002-11-30
emptyArrayToSingle(emptyArrayDateTime()); --0002-11-30 08:00:00

 


-- 4.生成一个含有N个元素的数组,元素从0开始增长,步长尾1.
-- range(N) 返回从0到N-1的数字数组。 以防万一,如果在数据块中创建总长度超过100,000,000个元素的数组,则抛出异常

SELECT
range(10), -- [0,1,2,3,4,5,6,7,8,9]
range(2), -- [0,1]
-- range(5.5), -- 出现异常,N为Int8的数据类型,正整数
-- range(-10), -- 出现异常,DB::Exception: Illegal type Int8 of argument of function range
range(1); -- 0

 


-- 5.新建一个数组的函数:array(x1,……) 类似于 直接[x1,……]

-- 注意:新建数组的每个元素的数据类型需保持一致性。
SELECT
array(1,2,2,3,4) AS "array()函数",
-- [1,'hello',3], -- 出现异常,DB::Exception: There is no supertype for types UInt8, String, UInt8 because some of them are String/FixedString and some of them are not (version 19.10.1.5 (official build))
[1,2,3,4] AS "[ ]";

 


-- 6.合并N个数组 arrayConcat(arrays) 合并参数中传递的所有数组。跟java的数组差不多的合并,不会自动去重,不会自动排序

SELECT
arrayConcat(array(1,2),array(2,3),array(4,5)), -- [1,2,2,3,4,5](第一种情况)
arrayConcat(array(1,1),array(2,2),array(3,3)), -- [1,1,2,2,3,3]
-- arrayConcat(array(1,2),['a','c'],array(3,3)), -- 出现异常,不能将不同类型的数组进行合并
arrayConcat(array(1,1),[2,3],array(4,5)); -- [1,1,2,3,4,5]

 


-- 7.从数组arr中获取索引为“n”的元素。
-- n必须是任何整数类型。 数组中的索引从一开始。 支持负索引。在这种情况下,它选择从末尾开始编号的相应元素。例如,arr [-1]是数组中的最后一项。
-- 如果索引超出数组的边界,则返回默认值(数字为0,字符串为空字符串等).

SELECT
arrayElement(array(10,20,3), 1), -- 10
arrayElement(array(1,20,3), 2), -- 20
arrayElement(array(1,2,30), 3), -- 30
arrayElement(array(10,20,3), 0), -- 0
arrayElement(array(10,20,3), -3), -- 10
arrayElement(array(10,20,3), -2), -- 20
arrayElement(array(10,20,3), -1);-- 3

 


-- 8.检查在数组中是否含有此元素。has(arr, elem) 包含此元素则返回1,否则返回0
-- has() 检查'arr'数组是否具有'elem'元素。 如果元素不在数组中,则返回0;如果在,则返回1。
-- hasAny(arr1, arr2) 返回1表示arr1和arr2存在交集。否则返回0.
--注意:特殊的定义:
-- ① “NULL”作为数组中的元素值进行处理。
-- ② 忽略两个数组中的元素值的顺序
-- hasAll(set, subset) 检查一个数组是否是另一个数组的子集。返回1,表示set包含subset中所有的元素
-- set – 具有一组元素的任何类型的数组。
-- subset – 任何类型的数组,其元素应该被测试为set的子集。
-- 注意:特殊的定义:
-- ① 空数组是任何数组的子集。
-- ② “NULL”作为数组中的元素值进行处理。
-- ③ 忽略两个数组中的元素值的顺序。

--hasSubstr(arr1, arr2): arr1= prefix+arr2+suffix时,才为1,否则均为0

SELECT
has([1,2,3], 2), -- 1
has(array(1,2,3),2), -- 1
has([1,2,NULL], NULL), -- 1 (注意:null值的处理)
-- has([], 2), -- 出现异常,DB::Exception: Types of array and 2nd argument of function has must be identical up to nullability or numeric types or Enum and numeric type. Passed: Array(Nothing) and UInt8
has([1,2], 3); -- 0
SELECT
hasAll([], []), -- 1
hasAll([1,NULL,NULL], [NULL]), -- 1
hasAll([1,2,3], [1,2]), -- 1
hasAll([1,2,2,3], [2]), -- 1
hasAll(array(1,2,2,3), [2]), -- 1
hasAll([1,2,3], [4,5]); -- 0
-- 多重数组(如下的二维数组)。
SELECT hasAll([[1, 2], [3, 4]], [[1, 2], [3, 5]]); -- 0
SELECT
hasAny(array(1,2,3), array(1)), -- 1
hasAny(array(1,2,3), array(1,4,56,80)), -- 1
-- []与array()是一样的含义,本质上是一直的。只不过[]更加简便而已。
hasAny(array(), array()), -- 0
hasAny([],[]), -- 0
hasAny([1],[]), -- 0
-- 空数组跟null不是一样的对象
hasAny([1,NULL],[]), -- 0
hasAny([1,NULL],[NULL,2]); -- 1

SELECT hasSubstr([1, 2, 3, 4], [2, 3]) -- 1.
SELECT hasSubstr([1, 2, 3, 4], [1, 3]) -- 0.

 

-- 9.返回数组指定元素的索引
-- indexOf(arr, x) 返回数组中第一个‘x’元素的索引(从1开始),如果‘x’元素不存在在数组中,则返回0。

SELECT indexOf(['one','two','three'], 'one'); -- 1
SELECT indexOf([1, 2, 4], 4); -- 3
SELECT
indexOf(['one','two','three'], 'one'), -- 1
indexOf(['one',NULL,NULL], NULL),-- 1返回第一个找到的元素的索引位置
indexOf([1, 2, 4], 4); -- 3
-- 数组元素的以第一个和最后一个元素。
SELECT length([12,3,4,4,4]);
SELECT array(12,22,31)[1];

WITH
[23,43,565,2,32,34] AS arr
SELECT
arr[1], -- 去除数组中的第一个元素
arr[length(arr)]; -- 提取元素中的最后一个元素

 


-- 10.计算数组中包含指定元素的个数
-- countEqual(arr, x) 返回数组中等于x的元素的个数。相当于arrayCount(elem - > elem = x,arr)。
-- 注意:null值将作为单独的元素值处理。

SELECT
countEqual([1, 2, 2, 2, 3, 4], 2), -- 3
countEqual([1, 2, NULL, NULL], NULL); -- 2

 --arrayCount([func,] arr)

SELECT arrayCount(e-> e>=3,[1,2,3,4]);
--2


-- 11.arrayEnumerate(arr) 返回 Array [1, 2, 3, ..., length (arr) ] 此功能通常与ARRAY JOIN一起使用。它允许在应用ARRAY JOIN后为每个数组计算一次。

SELECT arrayEnumerate([1,20,20,3]); -- [1,2,3,4]
SELECT arrayEnumerate(array(11,20,13)); -- [1,2,3]
SELECT arrayEnumerate(array(11,20,13,NULL)); -- [1,2,3,4] 注意:null也算是一个元素。
--arrayEnumerateUniq(arr) 返回与源数组大小相同的数组,其中每个元素表示与其下标对应的源数组元素在源数组中出现的次数
SELECT arrayEnumerateUniq([1,1,2,2]); -- [1,2]

 

-- 12.删除数组的元素
-- arrayPopBack(array) 删除数组array的最后一项

SELECT arrayPopBack(array(1,2,3,0)) AS res; -- [1,2,3]
-- arrayPopFront(array) 从数组中删除第一项
SELECT arrayPopFront(array(0,1,2,3)) AS res; -- [1,2,3]

 

-- 13.添加数组的元素 arrayPushFront(array, single_value) single_value是单个值

SELECT arrayPushBack([1,2,3], 0) AS res; -- [1,2,3,0]
SELECT arrayPushFront([1,2,3], 0) AS res; -- [0,1,2,3]

 

-- 14.更改数组的长度 arrayResize(arr, size[, extender])
-- 如果arr的长度 > size,则会对arr截取size的长度;
-- 如果arr的长度 < size,则其余位置用对应数据类型的默认值填充。
-- 注意:extender含义是扩展元素的值。如果没有指定extender,则默认按照对应的数据类型的默认值进行赋值。否则按照extender进行填充。

SELECT arrayResize([1,2,3], 5); -- [1,2,3,0,0]
SELECT arrayResize([1,2,3], 2); -- [1,2]
SELECT arrayResize([1,2,3], 3); -- [1,2,3]
--↓↓↓ RuntimeException: Parse exception: ByteFragment{[[[1,2],[3,4],[5,6],[],[]]], start=0, len=25}
SELECT arrayResize([array(1,2),array(3,4),array(5,6)], 5);
SELECT arrayResize([1,2,3], 5, 12); -- [1,2,3,12,12]
SELECT arrayResize(['one','two','three'], 5); -- ['one','two','three','','']
SELECT arrayResize(['one','two','three'], 5, 'default'); -- ['one','two','three','default','default']

 

-- 15.截取数组的部分元素,得到一个新的子数组
-- arraySlice(array, offset[, length])
-- 解释:
-- array: 数组,
-- offset – 数组的偏移。正值表示左侧的偏移量,负值表示右侧的缩进值。数组下标从1开始。
-- length - 子数组的长度。如果指定负值,则该函数返回[offset,array_length - length。如果省略该值,则该函数返回[offset,the_end_of_array]。

SELECT
arraySlice([1,2,3,4,5,6], 0, 3), -- 无返回值
arraySlice([1,2,NULL,5,6], 1, 3), -- [1,2,0]
arraySlice(['one','two',NULL], 1, 3), -- ['one','two','']
arraySlice([1,2,3,4,5,6], 1, 3); -- [1,2,3]

 



-- 16.数组排序:arraySort([func,] arr, ……)
-- 注意:如果在字符串数组中,''和NULL是需要特别对待的,''需要放在最前面,而NULL则是按顺序存放到最后的。
-- arraySort是高阶函数。您可以将lambda函数作为第一个参数传递给它。在这种情况下,排序顺序由lambda函数的调用结果决定。

SELECT
arraySort(['a','',NULL,'c','b']) AS hasNullempty1, --['','a','b','c',''] (第一个是'',最后一个''起始是NULL)
arraySort(array('ac','ab','bc','ad',NULL)) AS hasNull, -- ['ab','ac','ad','bc','']
arraySort(array('ac','','ab',NULL,'bc','ad',NULL)) AS hasNullempty2, -- ['','ab','ac','ad','bc','','']
arraySort([5,4,3,2,1]) AS numSorted,-- [1,2,3,4,5] (数字排序)
arraySort(['ca','bb','ac']) AS strSorted;-- ['ac','bb','ca'] (字符串排序)
SELECT
arraySort([NULL, 1, 3, NULL, 2]) AS sortedArr, -- [1,2,3,0,0]
arrayReverse(sortedArr) AS reverseSortdArr;-- [0,0,3,2,1]
-- 下面这种排序的实质,正数转成负数,再在数学上比较升序排序。
SELECT arraySort(x -> -x, [1,2,3]) as res; -- [3,2,1] 降序:(高阶函数用法)
SELECT arraySort((x) -> -x, [1,2,3]) as res; -- [3,2,1] 降序:(高阶函数用法)
SELECT arraySort(x -> x, [5,4,3,1,2,3]) as res; -- [1,2,3,3,4,5] 升序:(高阶函数用法)
SELECT arraySort((x) -> x, [5,4,3,1,2,3]) as res; -- [1,2,3,3,4,5] 升序:(高阶函数用法)
-- arraySort(lambda, arr1, arr2)
SELECT arraySort((x, y) -> y, ['hello', 'world'], [2, 1]) as res; -- ['world','hello']
SELECT arraySort((x, y) -> -y, [0, 1, 2], [1, 2, 3]) as res; -- [2,1,0]
-- 再次提醒:NULL, NaN, Inf的排序顺序:
-- 含义:
-- -Inf 是数组中的第一个。
-- NULL 是数组中的最后一个。
-- NaN 在NULL的前面。
-- Inf 在NaN的前面。
-- 出现异常:RuntimeException: Parse exception:
-- ByteFragment{[[-inf,-4,1,2,3,inf,nan,nan,NULL,NULL]], start=0, len=37}
SELECT arraySort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf]);

 

-- 17.数组翻转:arrayReverse([func,] arr, ……)
-- 如果是NULL的话在排序的过程中,根据数组的数据类型进行默认值填充。

SELECT
arrayReverse(array('a','b','c',NULL)) AS hasOneNull, -- ['','c','b','a']
arrayReverse(array('ac','ab','bc','ad',NULL)) AS hasNull, -- ['','ad','bc','ab','ac']
--网格视图: ['[NULL]','ad','bc','','ab','[NULL]','','ac'];文本视图 :['','ad','bc','','ab','','','ac']
arrayReverse(array('ac','',NULL,'ab','','bc','ad',NULL)) AS hasNullEmpty,
arrayReverse(array(NULL, 3, NULL, 2, 1)),-- [1,2,0,3,0]
arrayReverse([1,2,3,4]);-- [4,3,2,1]

 

-- 18.数组排序并翻转:arraySort([func,] arr, ...)

SELECT arrayReverseSort([1, 3, 3, 0]); -- [3,3,1,0]
SELECT arrayReverseSort(['hello', 'world', '!']); -- ['world','hello','!']
--RuntimeException: Parse exception: ByteFragment{[[inf,3,2,1,-4,-inf,nan,nan,NULL,NULL]], start=0, len=37}
SELECT arrayReverseSort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf]) as res;-- [inf,3,2,1,-4,-inf,nan,nan,NULL,NULL]
-- 下面的执行顺序为:
-- 1.首先,根据lambda函数的调用结果对源数组([1, 2, 3])进行排序。 结果是[3, 2, 1]。
-- 2.反转上一步获得的数组。 所以,最终的结果是[1, 2, 3]。
SELECT arrayReverseSort((x) -> -x, [1, 2, 3]) as res; -- [1,2,3]
SELECT arrayReverseSort((x) -> x, [1, 2, 3]) as res; -- [1,2,3]
-- 下面的执行顺序为:
-- 1.首先,根据lambda函数的调用结果对源数组(['hello','world'])进行排序。 其中,在第二个数组([2,1])中定义了源数组中相应元素的排序键。 所以,排序结果['world','hello']。
-- 2.反转上一步骤中获得的排序数组。 所以,最终的结果是['hello','world']。
SELECT arrayReverseSort((x, y) -> y, ['hello', 'world'], [2, 1]) as res;-- ['hello','world']
SELECT arrayReverseSort((x, y) -> -y, ['hello', 'world'], [2, 1]) as res;-- ['world','hello']
SELECT arrayReverseSort((x, y) -> x, ['hello', 'world'], [2, 1]) as res;-- ['world','hello']
--出现异常:Illegal type String of argument
--SELECT arrayReverseSort((x, y) -> -x, ['hello', 'world'], [2, 1]) as res;
SELECT arrayReverseSort((x, y) -> x, ['hello', 'world'], [1, 2]) as res;-- ['world','hello']

 

-- 19.统计数组中不重复元素的个数。arrayUniq(arr,……)
-- ① 如果传递一个参数,则计算数组中不同元素的数量。
-- ② 如果传递了多个参数,则它计算多个数组中相应位置的不同元素元组的数量

SELECT
arrayUniq([1,2,3]), -- 3
arrayUniq([1,2,2,2,3]); -- 3
SELECT
arrayUniq([1,2,3],[2,3,4]),
arrayUniq([1,2,2],[1,3,3]);

 

-- 20.数组的特殊功能:arrayJoin(arr) 这是一个非常有用的函数。
-- 解释:此函数将数组作为参数,并将该行在结果集中复制数组元素个数

SELECT arrayJoin([1, 2, 3] AS src) AS dst, 'Hello', src;
-- 每个元素扩大两倍;
SELECT arrayJoin([1,2,3]) * 2;
SELECT arrayJoin([-1,-2,0,1,2]) * 2;
--出现异常: Illegal types Array(UInt8) and Array(UInt8) of arguments of function multiply
--SELECT multiply(array(1,2,3), 2);
SELECT multiply(arrayJoin([-1,-2,0,1,2]), 2);
-- 每个元素缩小两倍
SELECT arrayJoin([-4,-2,0,2,4]) / 2;
SELECT divide(arrayJoin([-4,-2,0,2,4]) , 2);

 


-- 21.arrayDifference(arr)
-- 返回一个数组,其中包含所有相邻元素对之间的差值

SELECT arrayDifference([1,2,3,4]);-- [0,1,1,1]
SELECT arrayDifference([1,3,10,50]);-- [0,2,7,40]

 

-- 22. arrayDistinct(arr)返回一个包含所有数组中不同元素的数组.

-- 类似于java的Set集合,对list集合进行去重。
SELECT arrayDistinct(array(1,2,3,4,4,4)); -- [1,2,3,4]
SELECT arrayDistinct([1,2,2,3,4,2,2,5,4,5]); -- [1,2,3,4,5]
SELECT arrayDistinct(array(0,1,NULL,3,4,4,4)); -- [0,1,3,4]
-- 数组去重统计元素个数
SELECT uniq(arrayJoin([1,2,3,6,3])); -- 4 表示数组去重后元素的个数
SELECT uniqArray([1,2,3,4,1,2,3,4]); -- 4 表示数组去重后元素的个数
-- 数组元素累计
SELECT sumArray([1,2,3,4,5]);-- 15
SELECT sum(arraySum([1,2,3,4,5])); -- 15

 


-- 23. arrayEnumerateDense(arr) 返回与源数组大小相同的数组,指示每个元素首次出现在源数组中的位置

SELECT
arrayEnumerateDense([10,20,20,10,30]) AS numArrEnumDense,-- [1,2,2,1,3]
-- [1,1,2,3,4,1,3,5,5]
arrayEnumerateDense([10,10,2,12,3,10,12,NULL,NULL]) as arrEnumDenseHasNull,
-- [1,2,1,1,2,3]
arrayEnumerateDense([10,20,10,10,20,30]) AS arrEnumDese2;

 

-- 24. arrayIntersect(arr,……) 返回所有数组元素的交集。
-- 如果arr的数目只有一个,则返回它本身;如果有多个数组,则返回所有数组中元素的交集。
SELECT
-- 注意:最后得到的数组元素的顺序。(有什么影响吗?)

arrayIntersect(['one','two'],['one','two','three']) as uniStrArr1, -- ['two','one']
arrayIntersect(['aaa','bbb'],['bbb','aaa','three']) as uniStrArr2, -- ['bbb','aaa']
arrayIntersect([1,2],[1,2,3]) as uniArr1, -- [1,2]
arrayIntersect([1,2],[1,2,3],[2,3,4],[2,3,4]) as uniArr2; -- 2
SELECT
arrayIntersect([1,2], [3,4]), -- []
arrayIntersect([1,2]);-- [1,2]

 

-- 25.arrayReduce(agg_func, arr1, ...)
-- agg_func 为聚合函数,传入到数组当中。
-- 将聚合函数应用于数组并返回其结果.如果聚合函数具有多个参数,则此函数可应用于相同大小的多个数组。

SELECT
arrayReduce('max', [1,2,3]) AS minNum,--最大值 3
arrayReduce('min', [1,2,3]) AS maxNum,--最小值 1
arrayReduce('sum', [1,2,3]) AS sumNum;--求和 6

--26.arrayMap(func,arr1,...) 

--func是一个lambda表达式,通过该方法作用于原始数组中每一个数据,得到最终结果。

SELECT arrayMap(x -> (x + 2), [1, 2, 3]) as res;
┌─res─────┐
│ [3,4,5] │
└─────────┘
SELECT arrayMap((x, y) -> (x, y), [1, 2, 3], [4, 5, 6]) AS res
┌─res─────────────────┐
│ [(1,4),(2,5),(3,6)] │
└─────────────────────┘

--27.arrayFilter(func, arr1, …)

--func是一个lambda表达式,通过作用于数组中每一个元素后,只留下结果为非0的部分。

SELECT arrayFilter(x -> x LIKE '%World%', ['Hello', 'abc World']) AS res
┌─res───────────┐
│ ['abc World'] │
└───────────────┘
SELECT
    arrayFilter(
        (i, x) -> x LIKE '%World%',
        arrayEnumerate(arr),
        ['Hello', 'abc World'] AS arr)
    AS res
┌─res─┐
│ [2] │
└─────┘

注意:高级函数中,都支持多个数组参数,但是必须保证长度一致。多个数组在过滤时会组成多维数组,共享数组指针,但最终过滤后显示的只有第一个参数数组。

--28.arrayMin,arrayMax,arraySum,arrayAvg([func,] arr)

--数组计算
--函数均支持可选函数参数(lambda表达式),用法与arrayMap相同。

SELECT arraySum(x -> x*x, [2, 3]) AS res;
┌─res─┐
│  13 │
└─────┘

--29.arrayCumSum([func,] arr1, …), arrayCumSumNonNegative(arr)

--均为累加求和函数
--arrayCumSumNonNegative当返回值包含小于零的值时,该值将被替换为零,并以零参数执行后续计算

SELECT arrayCumSum([1, 1, 1, 1]) AS res
┌─res──────────┐
│ [1, 2, 3, 4] │
└──────────────┘
SELECT arrayCumSumNonNegative([1, 1, -4, 1]) AS res
┌─res───────┐
│ [1,2,0,1] │
└───────────┘

--30.arrayProduct(arr)

--将数据元素相乘

SELECT arrayProduct([1,2,3,4,5,6]) as res;
┌─res───┐
│ 720   │
└───────┘
--返回的结果,始终为Float64

--31.arrayCompact(arr)

--从数组中删除连续的重复元素。结果值的顺序由源数组中的顺序决定。

SELECT arrayCompact([1, 1, nan, nan, 2, 3, 3, 3]);
┌─arrayCompact([1, 1, nan, nan, 2, 3, 3, 3])─┐
│ [1,nan,nan,2,3]                            │
└────────────────────────────────────────────┘

--32.arrayZip(arr)

--合并多个数组,合并后长度不变,元素变为多个数组相同位置元素组成的元组(tuples)

SELECT arrayZip(['a', 'b', 'c'], [5, 2, 1]);
┌─arrayZip(['a', 'b', 'c'], [5, 2, 1])─┐
│ [('a',5),('b',2),('c',1)]            │
└──────────────────────────────────────┘

 -33.arrayFirstIndex(func, arr1, ...) 

返回`arr1`数组中第一个元素的索引,其中`func`返回的值不是 0。

请注意,`arrayFirstIndex`是一个 [高阶函数]。您必须将 lambda 函数作为第一个参数传递给它,并且不能省略。

select arrayFirstIndex(x -> x >=  2 , [ 1 , 2 , 3 , 4 , 2 ]);

SELECT arrayFirstIndex(x -> (x >= 2), [1, 2, 3, 4, 2])

Query id: af4f9d23-f757-4a6a-bdb6-dce2ab870135

┌─arrayFirstIndex(lambda(tuple(x), greaterOrEquals(x, 2)), [1, 2, 3, 4, 2])─┐
│                                                                         2 │
└───────────────────────────────────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.002 sec. 

--34.arrayLastIndex(func, arr1, ...) 

返回`arr1`数组中最后一个元素的索引,其中`func`返回的值不是 0。

请注意,`arrayLastIndex`是一个 [高阶函数]。您必须将 lambda 函数作为第一个参数传递给它,并且不能省略。

select arrayLastIndex(x -> x >=  2 , [ 1 , 2 , 3 ]);

SELECT arrayLastIndex(x -> (x >= 2), [1, 2, 3])

Query id: a22be78d-ec42-4d52-a7b5-7ef531a39841

┌─arrayLastIndex(lambda(tuple(x), greaterOrEquals(x, 2)), [1, 2, 3])─┐
│                                                                  3 │
└────────────────────────────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.009 sec. 

 --35.mapContains(m,arg)/mapKeys(m)/mapValues(m)

--map数据类型相关处理函数

 select map( 'aa', 4, 'bb' , 5) as m, mapContains(m, 'aa'),mapContains(m, 'cc'), mapKeys(m), mapValues(m);

SELECT
    map('aa', 4, 'bb', 5) AS m,
    mapContains(m, 'aa'),
    mapContains(m, 'cc'),
    mapKeys(m),
    mapValues(m)

Query id: 85089878-100a-47dd-92df-30eaacbede49

┌─m───────────────┬─mapContains(map('aa', 4, 'bb', 5), 'aa')─┬─mapContains(map('aa', 4, 'bb', 5), 'cc')─┬─mapKeys(map('aa', 4, 'bb', 5))─┬─mapValues(map('aa', 4, 'bb', 5))─┐
│ {'aa':4,'bb':5} │                                        10['aa','bb'][4,5]                            │
└─────────────────┴──────────────────────────────────────────┴──────────────────────────────────────────┴────────────────────────────────┴──────────────────────────────────┘

1 rows in set. Elapsed: 0.003 sec. 

 --36.其他

SELECT MID,M_RELATIONSHIP_NAME,multiIf (length(splitByChar ('/',M_RELATIONSHIP_NAME))=3,thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 3 ]],length(splitByChar ('/',M_RELATIONSHIP_NAME))=4,concat(thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 3 ]],'/',thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 4 ]]),length(splitByChar ('/',M_RELATIONSHIP_NAME))=5,concat(thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 3 ]],'/',thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 4 ]],'/',thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 5 ]]),length(splitByChar ('/',M_RELATIONSHIP_NAME))=6,concat(thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 3 ]],'/',thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 4 ]],'/',thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 5 ]],'/',thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 6 ]]),length(splitByChar ('/',M_RELATIONSHIP_NAME))=7,concat(thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 3 ]],'/',thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 4 ]],'/',thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 5 ]],'/',thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 6 ]],'/',thmap [ splitByChar ('/',M_RELATIONSHIP_NAME)[ 7 ]]),NULL) AS TH_RELATION_NAMES FROM (SELECT n.MID,cast(n.M_RELATIONSHIP_NAME as String) as M_RELATIONSHIP_NAME  FROM isv_data_prod.dwd_merchant_allattr n where M_CREATED_STAMP>'2022-07-01 00:00:00') thMERS,(SELECT CAST((KEY,VALUE),'Map(String, String)') AS thmap FROM (SELECT groupArray (a.*) KEY FROM (SELECT VID FROM isv_data_prod.dwd_vendor_allattr ORDER BY VID ASC) AS a) KEY,(SELECT groupArray (b.*) VALUE FROM (SELECT V_DESCRIPTION VALUE FROM isv_data_prod.dwd_vendor_allattr ORDER BY VID ASC) AS b) VALUE) thmap LIMIT 10;

 

posted @ 2022-01-18 13:44  渐逝的星光  阅读(2411)  评论(1编辑  收藏  举报