Map(K, V)
Map(K, V)
数据类型存储键值对。
与其他数据库不同,Map 在 ClickHouse 中不是唯一的,即一个 Map 可以包含两个具有相同键的元素。(原因是 Map 在内部实现为 Array(Tuple(K, V))
。)
您可以使用语法 m[k]
来获取 Map m
中键 k
的值。此外,m[k]
会扫描 Map,即操作的运行时长与 Map 的大小成线性关系。
参数
K
— Map 键的类型。任意类型,但 Nullable 和嵌套了 Nullable 类型的 LowCardinality 类型除外。V
— Map 值的类型。任意类型。
示例
创建一个包含 Map 类型列的表
CREATE TABLE tab (m Map(String, UInt64)) ENGINE=Memory;
INSERT INTO tab VALUES ({'key1':1, 'key2':10}), ({'key1':2,'key2':20}), ({'key1':3,'key2':30});
选择 key2
值
SELECT m['key2'] FROM tab;
结果
┌─arrayElement(m, 'key2')─┐
│ 10 │
│ 20 │
│ 30 │
└─────────────────────────┘
如果请求的键 k
未包含在 Map 中,则 m[k]
返回值类型的默认值,例如,整数类型为 0
,字符串类型为 ''
。要检查 Map 中是否存在键,您可以使用函数 mapContains。
CREATE TABLE tab (m Map(String, UInt64)) ENGINE=Memory;
INSERT INTO tab VALUES ({'key1':100}), ({});
SELECT m['key1'] FROM tab;
结果
┌─arrayElement(m, 'key1')─┐
│ 100 │
│ 0 │
└─────────────────────────┘
将 Tuple 转换为 Map
类型为 Tuple()
的值可以使用函数 CAST 转换为类型为 Map()
的值
示例
查询
SELECT CAST(([1, 2, 3], ['Ready', 'Steady', 'Go']), 'Map(UInt8, String)') AS map;
结果
┌─map───────────────────────────┐
│ {1:'Ready',2:'Steady',3:'Go'} │
└───────────────────────────────┘
读取 Map 的子列
为了避免读取整个 Map,在某些情况下,您可以使用子列 keys
和 values
。
示例
查询
CREATE TABLE tab (m Map(String, UInt64)) ENGINE = Memory;
INSERT INTO tab VALUES (map('key1', 1, 'key2', 2, 'key3', 3));
SELECT m.keys FROM tab; -- same as mapKeys(m)
SELECT m.values FROM tab; -- same as mapValues(m)
结果
┌─m.keys─────────────────┐
│ ['key1','key2','key3'] │
└────────────────────────┘
┌─m.values─┐
│ [1,2,3] │
└──────────┘
参见
- map() 函数
- CAST() 函数
- -Map 组合器用于 Map 数据类型