3.1.1及以後版本的AnalyticDB for MySQL叢集支援Array、Map資料類型。本文介紹了Array資料類型的定義、注意事項及使用樣本。
Array類型定義
Array類型,儲存數組,可重複,含義類似Java中LIST。Array中資料為相同類型。例如,列A定義array<int>
, 那麼A中子項目均為int類型。支援嵌套,例如array<array<string>>
。
注意事項
Array或Map列不支援構建索引,因此,在SQL查詢語句中不建議直接過濾,需配合其他檢索條件過濾。盡量減少掃描資料量。
使用樣本
建立表
CREATE TABLE `array_test` ( `a` INT, `b` ARRAY<INT>, `c` ARRAY<ARRAY<STRING>>, PRIMARY KEY (`a`) ) DISTRIBUTED BY HASH(`a`)
寫入資料
比如插入一行資料,其中
b=[1,2,3], c=[["a"],["b","c"]]
:INSERT INTO array_test VALUES (1, '[1,2,3]', '[["a"],["b","c"]]');
查詢資料
mysql> SELECT * FROM array_test; +------+---------+-------------------+ | a | b | c | +------+---------+-------------------+ | 1 | [1,2,3] | [["a"],["b","c"]] | +------+---------+-------------------+ 1 row in set (0.08 sec)
重要Array類型下標是從1開始,而不是0。
Array的取址操作:
b[1]
等價於函數element_at(b, 1)
。
mysql> SELECT a,b[1],element_at(b,1),c[2],element_at(c,2) FROM array_test; +------+------+-----------------+-----------+-----------------+ | a | b[1] | element_at(b,1) | c[2] | element_at(c,2) | +------+------+-----------------+-----------+-----------------+ | 1 | 1 | 1 | ["b","c"] | ["b","c"] | +------+------+-----------------+-----------+-----------------+ 1 row in set (0.11 sec)
查詢結果傳回型別為Array或Map的列,以JSON格式字串輸出。比如
c[2]
對應的是嵌套子列,類型為array<string>
,那麼以JSON格式返回。
支援的函數
函數 | 描述 | 傳回型別 |
element_at | 取值,下標從1開始,例如 | T |
size | 元素個數。 | int |
contains | 是否包含子項目,例如 | bool類型 |
array_max | 取子項目最大值。 | T |
array_min | 取子項目最小值。 | T |
array_position | 取第一次出現的Index,例如 | int |
array_remove | 移除子項目,例如 | array<T> |
array_sort | 排序, | array<T> |
reverse | 將數組中的子項目反轉,例如 | array<T> |
shuffle | 把數組中的元素按隨機順序重新排列,例如 | array<T> |
slice | 截取子項目,例如 | array<T> |
concat | 子項目合并且包含重複,例如 | array<T> |
array_distinct | 子項目去重,例如 | array<T> |
array_union | 子項目合并且去重,例如 | array<T> |
array_intersect | 求交集,例如 | array<T> |
array_join | 類似Joiner拼接Array元素,例如 | string |
flatten | 降維,例如 | array<X> |