3.1.1及以後版本的AnalyticDB for MySQL叢集支援Array、Map資料類型。本文介紹了Map資料類型的定義、注意事項及使用樣本。
Map類型定義
Map類型,儲存k-v
索引值對,含義類似Java中的Map。其中key類型要求是原生類型(如tinyint
、boolean
、smallint
、int
、bigint
、float
、double
、string
),value
類型可以是原生類型,也可以是Map或Array類型。例如,列定義map<int, string>
、map<int, map<int, string>>
。
注意事項
Array或Map列不支援構建索引,因此,在SQL查詢語句中不建議直接過濾,需配合其他檢索條件過濾。盡量減少scan資料量。
針對一條Map記錄,key不能重複。
不保證key的寫入順序。比如寫入時
{"a":1,"b":2,"d":3}
,查詢時結果為{"d":3, "a":1, "b":2}
。
使用樣本
建立表
Create Table `map_test` ( `a` int, `b` map<int, string>, `c` map<int, map<int, string>>, PRIMARY KEY (`a`) ) DISTRIBUTED BY HASH(`a`)
寫入資料
比如插入一行資料,其中
b={1:"a"}, c={1:{11:"a"},2:{22:"b"}}
:INSERT INTO map_test VALUES(1, '{1:"a"}','{1:{11:"a"},2:{22:"b"}}');
查詢資料
SELECT * FROM map_test; +------+---------+-------------------------+ | a | b | c | +------+---------+-------------------------+ | 1 | {1:"a"} | {1:{11:"a"},2:{22:"b"}} | +------+---------+-------------------------+ 1 row in set (0.07 sec)
重要Map類型的根據key取值操作:
element_at(b, 1)
,其中1表示key值,不是下標。Map類型,size函數返回的是key、value的個數總和。
map_keys
和map_values
返回Array類型。
SELECT element_at(c,1), element_at(element_at(c,1),11) FROM map_test; +-----------------+--------------------------------+ | element_at(c,1) | element_at(element_at(c,1),11) | +-----------------+--------------------------------+ | {11:"a"} | a | +-----------------+--------------------------------+ 1 row in set (0.07 sec) SELECT map_keys(b),map_values(b),size(b),size(map_keys(b)),size(map_values(b)) FROM map_test; +-------------+---------------+---------+-------------------+---------------------+ | map_keys(b) | map_values(b) | size(b) | size(map_keys(b)) | size(map_values(b)) | +-------------+---------------+---------+-------------------+---------------------+ | [1] | ["a"] | 2 | 1 | 1 | +-------------+---------------+---------+-------------------+---------------------+ 1 row in set (0.08 sec) SELECT map_keys(c),map_values(c),size(c),size(map_keys(c)),size(map_values(c)) FROM map_test; +-------------+---------------------+---------+-------------------+---------------------+ | map_keys(c) | map_values(c) | size(c) | size(map_keys(c)) | size(map_values(c)) | +-------------+---------------------+---------+-------------------+---------------------+ | [1,2] | [{11:"a"},{22:"b"}] | 4 | 2 | 2 | +-------------+---------------------+---------+-------------------+---------------------+ 1 row in set (0.08 sec)
支援的函數
函數 | 描述 | 傳回型別 |
element_at | 根據key值,擷取value。例如 | V |
size | key個數與value個數總和。 | int |
map_keys | 擷取所有key列表。 | array<K> |
map_values | 擷取所有value列表。 | array<V> |