Перейти к основному содержанию
Перейти к основному содержанию

Map(K, V)

Тип данных Map(K, V) хранит пары «ключ–значение».

В отличие от других баз данных, в ClickHouse элементы типа Map не обязаны быть уникальными, то есть Map может содержать два элемента с одинаковым ключом. (Причина в том, что Map внутренне реализован как Array(Tuple(K, V)).)

Вы можете использовать синтаксис m[k], чтобы получить значение для ключа k в Map m. Также операция m[k] последовательно сканирует Map, то есть время выполнения линейно зависит от размера Map.

Параметры

  • K — тип ключей Map. Произвольный тип, за исключением Nullable и LowCardinality, совмещённых с типами Nullable.
  • 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 для целочисленных типов и '' для строковых типов. Чтобы проверить, существует ли ключ в отображении, можно использовать функцию 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() можно привести к значениям типа Map() с помощью функции CAST:

Пример

Запрос:

SELECT CAST(([1, 2, 3], ['Ready', 'Steady', 'Go']), 'Map(UInt8, String)') AS map;

Результат:

┌─map───────────────────────────┐
│ {1:'Готово',2:'Внимание',3:'Марш'} │
└───────────────────────────────┘

Чтение подстолбцов 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; --   то же, что mapKeys(m)
SELECT m.values FROM tab; -- то же, что mapValues(m)

Результат:

┌─m.keys─────────────────┐
│ ['key1','key2','key3'] │
└────────────────────────┘

┌─m.values─┐
│ [1,2,3]  │
└──────────┘

См. также