ClickHouse/docs/ru/sql-reference/functions/tuple-map-functions.md
2022-08-26 13:37:11 -04:00

15 KiB
Raw Blame History

slug sidebar_position sidebar_label
/ru/sql-reference/functions/tuple-map-functions 46 Работа с контейнерами map

Функции для работы с контейнерами map

map

Преобразовывает пары ключ:значение в тип данных Map(key, value).

Синтаксис

map(key1, value1[, key2, value2, ...])

Аргументы

Возвращаемое значение

  • Структура данных в виде пар ключ:значение.

Тип: Map(key, value).

Примеры

Запрос:

SELECT map('key1', number, 'key2', number * 2) FROM numbers(3);

Результат:

┌─map('key1', number, 'key2', multiply(number, 2))─┐
│ {'key1':0,'key2':0}                              │
│ {'key1':1,'key2':2}                              │
│ {'key1':2,'key2':4}                              │
└──────────────────────────────────────────────────┘

Запрос:

CREATE TABLE table_map (a Map(String, UInt64)) ENGINE = MergeTree() ORDER BY a;
INSERT INTO table_map SELECT map('key1', number, 'key2', number * 2) FROM numbers(3);
SELECT a['key2'] FROM table_map;

Результат:

┌─arrayElement(a, 'key2')─┐
│                       0 │
│                       2 │
│                       4 │
└─────────────────────────┘

Смотрите также

mapAdd

Собирает все ключи и суммирует соответствующие значения.

Синтаксис

mapAdd(arg1, arg2 [, ...])

Аргументы

Аргументами являются контейнеры Map или кортежи из двух массивов, где элементы в первом массиве представляют ключи, а второй массив содержит значения для каждого ключа. Все массивы ключей должны иметь один и тот же тип, а все массивы значений должны содержать элементы, которые можно приводить к одному типу (Int64, UInt64 или Float64). Общий приведенный тип используется в качестве типа для результирующего массива.

Возвращаемое значение

  • В зависимости от типа аргументов возвращает один Map или кортеж, в котором первый массив содержит отсортированные ключи, а второй — значения.

Пример

Запрос с кортежем:

SELECT mapAdd(([toUInt8(1), 2], [1, 1]), ([toUInt8(1), 2], [1, 1])) as res, toTypeName(res) as type;

Результат:

┌─res───────────┬─type───────────────────────────────┐
│ ([1,2],[2,2]) │ Tuple(Array(UInt8), Array(UInt64)) │
└───────────────┴────────────────────────────────────┘

Запрос с контейнером Map:

SELECT mapAdd(map(1,1), map(1,1));

Результат:

┌─mapAdd(map(1, 1), map(1, 1))─┐
│ {1:2}                        │
└──────────────────────────────┘

mapSubtract

Собирает все ключи и вычитает соответствующие значения.

Синтаксис

mapSubtract(Tuple(Array, Array), Tuple(Array, Array) [, ...])

Аргументы

Аргументами являются контейнеры Map или кортежи из двух массивов, где элементы в первом массиве представляют ключи, а второй массив содержит значения для каждого ключа. Все массивы ключей должны иметь один и тот же тип, а все массивы значений должны содержать элементы, которые можно приводить к одному типу (Int64, UInt64 или Float64). Общий приведенный тип используется в качестве типа для результирующего массива.

Возвращаемое значение

  • В зависимости от аргумента возвращает один Map или кортеж, в котором первый массив содержит отсортированные ключи, а второй — значения.

Пример

Запрос:

SELECT mapSubtract(([toUInt8(1), 2], [toInt32(1), 1]), ([toUInt8(1), 2], [toInt32(2), 1])) as res, toTypeName(res) as type;

Результат:

┌─res────────────┬─type──────────────────────────────┐
│ ([1,2],[-1,0]) │ Tuple(Array(UInt8), Array(Int64)) │
└────────────────┴───────────────────────────────────┘

Запрос с контейнером Map:

SELECT mapSubtract(map(1,1), map(1,1));

Результат:

┌─mapSubtract(map(1, 1), map(1, 1))─┐
│ {1:0}                             │
└───────────────────────────────────┘

mapPopulateSeries

Заполняет недостающие ключи в контейнере map (пара массивов ключей и значений), где ключи являются целыми числами. Кроме того, он поддерживает указание максимального ключа, который используется для расширения массива ключей.

Синтаксис

mapPopulateSeries(keys, values[, max])
mapPopulateSeries(map[, max])

Генерирует контейнер map, где ключи - это серия чисел, от минимального до максимального ключа (или аргумент max, если он указан), взятых из массива keys с размером шага один, и соответствующие значения, взятые из массива values. Если значение не указано для ключа, то в результирующем контейнере используется значение по умолчанию.

Количество элементов в keys и values должно быть одинаковым для каждой строки.

Аргументы

Аргументами являются контейнер Map или два массива, где первый массив представляет ключи, а второй массив содержит значения для каждого ключа.

Сопоставленные массивы:

или

  • map — контейнер Map с целочисленными ключами. Map.

Возвращаемое значение

  • В зависимости от аргумента возвращает контейнер Map или кортеж из двух массивов: ключи отсортированные по порядку и значения соответствующих ключей.

Пример

Запрос с сопоставленными массивами:

SELECT mapPopulateSeries([1,2,4], [11,22,44], 5) AS res, toTypeName(res) AS type;

Результат:

┌─res──────────────────────────┬─type──────────────────────────────┐
│ ([1,2,3,4,5],[11,22,0,44,0]) │ Tuple(Array(UInt8), Array(UInt8)) │
└──────────────────────────────┴───────────────────────────────────┘

Запрос с контейнером Map:

SELECT mapPopulateSeries(map(1, 10, 5, 20), 6);

Результат:

┌─mapPopulateSeries(map(1, 10, 5, 20), 6)─┐
│ {1:10,2:0,3:0,4:0,5:20,6:0}             │
└─────────────────────────────────────────┘

mapContains

Определяет, содержит ли контейнер map ключ key.

Синтаксис

mapContains(map, key)

Аргументы

  • map — контейнер Map. Map.
  • key — ключ. Тип соответстует типу ключей параметра map.

Возвращаемое значение

  • 1 если map включает key, иначе 0.

Тип: UInt8.

Пример

Запрос:

CREATE TABLE test (a Map(String,String)) ENGINE = Memory;

INSERT INTO test VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});

SELECT mapContains(a, 'name') FROM test;

Результат:

┌─mapContains(a, 'name')─┐
│                      1 │
│                      0 │
└────────────────────────┘

mapKeys

Возвращает все ключи контейнера map.

Функцию можно оптимизировать, если включить настройку optimize_functions_to_subcolumns. При optimize_functions_to_subcolumns = 1 функция читает только подстолбец keys вместо чтения и обработки данных всего столбца. Запрос SELECT mapKeys(m) FROM table преобразуется к запросу SELECT m.keys FROM table.

Синтаксис

mapKeys(map)

Аргументы

  • map — контейнер Map. Map.

Возвращаемое значение

  • Массив со всеми ключами контейнера map.

Тип: Array.

Пример

Запрос:

CREATE TABLE test (a Map(String,String)) ENGINE = Memory;

INSERT INTO test VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});

SELECT mapKeys(a) FROM test;

Результат:

┌─mapKeys(a)────────────┐
│ ['name','age']        │
│ ['number','position'] │
└───────────────────────┘

mapValues

Возвращает все значения контейнера map.

Функцию можно оптимизировать, если включить настройку optimize_functions_to_subcolumns. При optimize_functions_to_subcolumns = 1 функция читает только подстолбец values вместо чтения и обработки данных всего столбца. Запрос SELECT mapValues(m) FROM table преобразуется к запросу SELECT m.values FROM table.

Синтаксис

mapKeys(map)

Аргументы

  • map — контейнер Map. Map.

Возвращаемое значение

  • Массив со всеми значениями контейнера map.

Тип: Array.

Примеры

Запрос:

CREATE TABLE test (a Map(String,String)) ENGINE = Memory;

INSERT INTO test VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});

SELECT mapValues(a) FROM test;

Результат:

┌─mapValues(a)─────┐
│ ['eleven','11']  │
│ ['twelve','6.0'] │
└──────────────────┘