3.1.1及以后版本的AnalyticDB MySQL版集群支持Array、Map数据类型。本文介绍了Map数据类型的定义、注意事项及使用示例。

Map类型定义

Map类型,存储k-v键值对,含义类似Java中的Map。其中key类型要求是原生类型(如byte/boolean/short/int/long/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`)
) DISTRIBUTE 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_keysmap_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。例如element_at(map(array["a","b"],array[1,2]), a) ==> 1 V
size key个数与value个数总和。 int
map_keys 获取所有key列表。 array<K>
map_values 获取所有value列表。 array<V>