文章目錄
- 數組
- 判斷是否為空
- 計算數組長度
- 獲取數組元素
- 判斷某個元素是否存在
- 數組切片
- 數組元素展開
- 數組元素去重
- 刪除連續重復元素
- 連接多個數組
- 數組倒序
- 數組拍平
- 數組元素映射
- 數組元素過濾
- 數組聚合分析
- 計算數組交集
- 計算數組并集
- 計算數組差集
- SQL 子查詢進行集合操作
- 元組
- 創建元組
- 獲取元組中的元素
- 插入元組元素
數組
數組中的數據類型
- 數組中的每一個元素都是同一種數據,在一個數組中創建使用不同數據類型,會報錯。
- 當數組中的元素都不為空時,數組類型就是不可空的。
- 如果數組中元素有一個NULL(空值),類型會相應地變成可空元素類型。
判斷是否為空
SELECTempty([]) AS isEmpty,empty([1]) AS notEmpty
FORMAT Vertical# 輸出
isEmpty: 1
notEmpty: 0
計算數組長度
SELECTlength([1,2,3]) AS a1,length([]) AS a2,length(NULL) AS a3
FORMAT Vertical# 輸出
a1: 3
a2: 0
a3: NULL
獲取數組元素
clickhouse 數組元素通過索引訪問,索引從1開始。
判斷某個元素是否存在
SELECT has([1,2,3], 1) AS hasIt###############
┌─hasIt─┐
│ 1 │
└───────┘
數組切片
參數說明:
- 數組
- 偏移量,正數從左邊開始,負數從右邊開始,需要注意clickhouse 索引下標從1開始
- 數組長度
SELECTarraySlice([10, 20, 30, 40, 50], 1, 2) AS res1,arraySlice([10, 20, 30, 40, 50], 1) AS res2
FORMAT Vertical################
res1: [10,20]
res2: [10,20,30,40,50]
數組元素展開
將數組中的元素展開至多行
SELECT arrayJoin([1,2,3])###############
┌─arrayJoin([1, 2, 3])─┐
│ 1 │
│ 2 │
│ 3 │
└──────────────────────┘
數組元素去重
SELECT arrayDistinct([1,1,nan,nan,2,3,3,3,NULL,NULL,3,4,5,6,6,6]) as c
FORMAT Vertical#######################
c: [1,nan,2,3,4,5,6]
刪除連續重復元素
SELECT arrayCompact([1,1,nan,nan,2,3,3,3,NULL,NULL,3,4,5,6,6,6]) AS c
FORMAT Vertical####################
c: [1,nan,2,3,NULL,3,4,5,6]
連接多個數組
SELECT arrayConcat([1,2], [3,4], [5,6,3,4]) as res#######################
┌─res───────────────┐
│ [1,2,3,4,5,6,3,4] │
└───────────────────┘
數組倒序
SELECT arrayReverse([1,2,3]) as res################
┌─res─────┐
│ [3,2,1] │
└─────────┘
數組拍平
SELECT arrayFlatten([[[1]], [[2], [3,4,5]]] AS src) AS flatArr, src
FORMAT Vertical######################
flatArr: [1,2,3,4,5]
src: [[[1]],[[2],[3,4,5]]]
數組元素映射
SELECT arrayMap(x -> (x*x), [1,2,3]) AS res
FORMAT Vertical#####################
res: [1,4,9]
數組元素過濾
SELECT arrayFilter(x -> ((x%2) = 0), [1,2,3,4,5,6]) AS res
FORMAT Vertical#############
res: [2,4,6]
數組聚合分析
將數組中的元素放入聚合函數執行,并返回結果,需要注意函數參數使用單引號
SELECT arrayReduce('max', [1,2,3,3,4,4]) as res##################
┌─res─┐
│ 4 │
└─────┘SELECT arrayReduce('sum', [1,2,3,3,4,4]) as res#############
┌─res─┐
│ 17 │
└─────┘
計算數組交集
SELECT arrayIntersect([1,2,3,3], [4,5,6]) AS noIntersect,arrayIntersect([1,2,3,3], [3,4,5,6]) AS hasIntersect
FORMAT Vertical##################
noIntersect: []
hasIntersect: [3]
計算數組并集
SELECT [1,2] AS a,[2,3] AS b,arrayDistinct(arrayConcat(a,b)) AS res
FORMAT Vertical##################
a: [1,2]
b: [2,3]
res: [1,2,3]
計算數組差集
需要結合 arrayIntersect 和 arrayMap 和 arrayFilter 組合實現。
SELECT [1,2] AS a,[2,3] AS b,arrayFilter(x -> (x IS NOT NULL), arrayMap(x -> multiIf(x NOT IN arrayIntersect(a,b), x, NULL), a)) AS res
FORMAT Vertical##################
a: [1,2]
b: [2,3]
res: [1]
SQL 子查詢進行集合操作
交集SQL
SELECT a.i
FROM
(SELECT arrayJoin([1,2]) AS i
) AS a
INTERSECT
SELECT b.i
FROM
(SELECT arrayJoin([2,3]) AS i
) AS b####################
┌─i─┐
│ 2 │
└───┘
并集 SQL
SET union_default_mode = 'ALL';SELECT DISTINCT t.i
FROM
(SELECT a.iFROM(SELECT arrayJoin([1,2]) AS i) AS aUNIONSELECT b.iFROM (SELECT arrayJoin([2,3]) AS i)AS b
) AS t########################
┌─i─┐
│ 2 │
│ 3 │
└───┘
┌─i─┐
│ 1 │
└───┘
差集 SQL
SELECT a.i
FROM
(SELECT arrayJoin([1,2]) AS i
) AS a
EXCEPT
SELECT b.i
FROM
(SELECT arrayJoin([2,3]) AS i
) AS b########################
┌─i─┐
│ 1 │
└───┘
元組
元組中的數據類型說明
- 不同于數組中的每個元素類型要一樣,元組中的元素類型可以不一樣
- 元組一般表示列的聚合,SQL 中的 in 查詢也是使用的元組
- 在 clickhouse 中元組也可以作為查詢的結果
創建元組
SELECT tuple(1, 'a', NULL) AS x, toTypeName(x) as tp FORMAT Vertical;SELECT (1, 'a', NULL) AS x, toTypeName(x) as tp FORMAT Vertical;
獲取元組中的元素
元組和數組一樣,元素索引都是從1開始。
select (1, 'a', 3, 4) as tp1, tupleElement(tp1, 2) as t2 Format Vertical;
# 等價于
select (1, 'a', 3, 4) as tp1, tp1.2 as t2 Format Vertical;################
tp1: (1,'a',3,4)
t2: a
獲取元組中的每個元素:
select (1, 'a', 3, 4) as tp1, untuple(tp1) as t2 Format Vertical;#####################
tp1: (1,'a',3,4)
t2.1: 1
t2.2: a
t2.3: 3
t2.4: 4
插入元組元素
CREATE TABLE t1
(`a` Date,`b` UInt8,`c` Tuple(UInt8, String)
)
Engine = MergeTree(a, b, 8192);insert into t1(a, b, c) values(now(), 1, (1, 'a'));