十二、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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM