slug: /zh/sql-reference/data-types/map sidebar_position: 65

sidebar_label: Map(key, value)

Map(key, value) {#data_type-map}

Map(key, value) 可以存储 key:value 键值对类型的数据。

参数

使用 a['key'] 可以从 a Map('key', 'value') 类型的列中获取到对应的值,这是一个线性复杂度的查询。

示例

示例表:

  1. CREATE TABLE table_map (a Map(String, UInt64)) ENGINE=Memory;
  2. INSERT INTO table_map VALUES ({'key1':1, 'key2':10}), ({'key1':2,'key2':20}), ({'key1':3,'key2':30});

查询 key2 的所有值:

  1. SELECT a['key2'] FROM table_map;

查询结果:

  1. ┌─arrayElement(a, 'key2')─┐
  2. 10
  3. 20
  4. 30
  5. └─────────────────────────┘

如果在 Map() 类型的列中,查询的 key 值不存在,那么根据 value 的类型,查询结果将会是数字0,空字符串或者空数组。

  1. INSERT INTO table_map VALUES ({'key3':100}), ({});
  2. SELECT a['key3'] FROM table_map;

查询结果:

  1. ┌─arrayElement(a, 'key3')─┐
  2. 100
  3. 0
  4. └─────────────────────────┘
  5. ┌─arrayElement(a, 'key3')─┐
  6. 0
  7. 0
  8. 0
  9. └─────────────────────────┘

将Tuple类型转换成Map类型 {#map-and-tuple}

您可以使用 CAST 方法将 Tuple() 转换成 Map()

  1. SELECT CAST(([1, 2, 3], ['Ready', 'Steady', 'Go']), 'Map(UInt8, String)') AS map;
  1. ┌─map───────────────────────────┐
  2. {1:'Ready',2:'Steady',3:'Go'}
  3. └───────────────────────────────┘

Map.keys 和 Map.values 单独使用 {#map-subcolumns}

为了更好使用 Map 类型,在一定的场景下,可以单独使用 keys 或者 values,而不需要将整个列的数据都读取出来。

示例

查询:

  1. CREATE TABLE t_map (`a` Map(String, UInt64)) ENGINE = Memory;
  2. INSERT INTO t_map VALUES (map('key1', 1, 'key2', 2, 'key3', 3));
  3. SELECT a.keys FROM t_map;
  4. SELECT a.values FROM t_map;

结果:

  1. ┌─a.keys─────────────────┐
  2. ['key1','key2','key3']
  3. └────────────────────────┘
  4. ┌─a.values─┐
  5. [1,2,3]
  6. └──────────┘

另请参阅

Original article