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> |