Функции и операторы map#
Данный документ описывает операторы и функции для работы с типом данных MAP.
Для создания MAP задайте массив ключей и массив значений (ключи должны быть символьного типа и не могут быть null).
Создание map с целочисленными значениями:
SELECT MAP(ARRAY['key1', 'key2', 'key3' ], ARRAY[2373, 3463, 45837]);
-- {key1=2373, key2=3463, key3=45837}
Создание map с символьными значениями:
SELECT MAP(ARRAY['key1', 'key2', 'key3' ], ARRAY['v1', 'v2', 'v3']);
-- {key1=v1, key2=v2, key3=v3}
Значения должны быть одного типа, либо должна существовать возможность приведения значений к общему типу. В следующем примере используются целочисленные и десятичные значения, а результирующий map содержит десятичные числа:
SELECT MAP(ARRAY['key1', 'key2', 'key3' ], ARRAY[23, 34.63, 45.837]);
-- {key1=23.000, key2=34.630, key3=45.837}
Значения null допустимы:
SELECT MAP(ARRAY['key1', 'key2', 'key3' ], ARRAY['v1', NULL, 'v3']);
-- {key1=v1, key2=NULL, key3=v3}
Оператор доступа по ключу: []#
Оператор [] используется для получения значения, соответствующего заданному ключу в map.
Этот оператор вызывает ошибку, если ключ отсутствует в map.
Смотрите также функцию element_at, которая возвращает NULL в таком случае.
SELECT name_to_age_map['Bob'] AS bob_age;
Следующий пример создает map и затем обращается к элементу с ключом key2:
SELECT MAP(ARRAY['key1', 'key2', 'key3' ], ARRAY['v1', 'v2', 'v3'])['key2'];
-- v2
Функции map#
- cardinality(x) bigint
Возвращает кардинальность (размер) map
x.
- element_at(map(K, V), key) V
Возвращает значение для заданного ключа
keyилиNULL, если ключ отсутствует в map.
- map() map<unknown, unknown>#
Возвращает пустой map.
SELECT map(); -- {}
- map(array(K), array(V)) -> map(K, V)
Возвращает map, созданный из заданных массивов ключей и значений.
SELECT map(ARRAY[1,3], ARRAY[2,4]); -- {1 -> 2, 3 -> 4}
Смотрите также
map_agg()иmultimap_agg()для создания map в качестве агрегации.
- map_from_entries(array(row(K, V))) -> map(K, V)#
Возвращает map, созданный из заданного массива записей.
SELECT map_from_entries(ARRAY[(1, 'x'), (2, 'y')]); -- {1 -> 'x', 2 -> 'y'}
- multimap_from_entries(array(row(K, V))) -> map(K, array(V))#
Возвращает multimap, созданный из заданного массива записей. Каждый ключ может быть связан с несколькими значениями.
SELECT multimap_from_entries(ARRAY[(1, 'x'), (2, 'y'), (1, 'z')]); -- {1 -> ['x', 'z'], 2 -> ['y']}
- map_entries(map(K, V)) -> array(row(K, V))#
Возвращает массив всех записей в заданном map.
SELECT map_entries(MAP(ARRAY[1, 2], ARRAY['x', 'y'])); -- [ROW(1, 'x'), ROW(2, 'y')]
- map_concat(map1(K, V), map2(K, V), ..., mapN(K, V)) -> map(K, V)#
Возвращает объединение всех заданных map. Если ключ присутствует в нескольких map, значение этого ключа в результирующем map берется из последнего map, содержащего этот ключ.
- map_filter(map(K, V), function(K, V, boolean)) -> map(K, V)#
Создает map из тех записей исходного
map, для которыхfunctionвозвращает true:SELECT map_filter(MAP(ARRAY[], ARRAY[]), (k, v) -> true); -- {} SELECT map_filter(MAP(ARRAY[10, 20, 30], ARRAY['a', NULL, 'c']), (k, v) -> v IS NOT NULL); -- {10 -> a, 30 -> c} SELECT map_filter(MAP(ARRAY['k1', 'k2', 'k3'], ARRAY[20, 3, 15]), (k, v) -> v > 10); -- {k1 -> 20, k3 -> 15}
- map_keys(x(K, V)) -> array(K)#
Возвращает все ключи map
x.
- map_values(x(K, V)) -> array(V)#
Возвращает все значения map
x.
- map_zip_with(map(K, V1), map(K, V2), function(K, V1, V2, V3)) -> map(K, V3)#
Объединяет два заданных map в один, применяя
functionк паре значений с одинаковым ключом. Для ключей, присутствующих только в одном из map, в качестве значения отсутствующего ключа передаетсяNULL.SELECT map_zip_with(MAP(ARRAY[1, 2, 3], ARRAY['a', 'b', 'c']), MAP(ARRAY[1, 2, 3], ARRAY['d', 'e', 'f']), (k, v1, v2) -> concat(v1, v2)); -- {1 -> ad, 2 -> be, 3 -> cf} SELECT map_zip_with(MAP(ARRAY['k1', 'k2'], ARRAY[1, 2]), MAP(ARRAY['k2', 'k3'], ARRAY[4, 9]), (k, v1, v2) -> (v1, v2)); -- {k1 -> ROW(1, null), k2 -> ROW(2, 4), k3 -> ROW(null, 9)} SELECT map_zip_with(MAP(ARRAY['a', 'b', 'c'], ARRAY[1, 8, 27]), MAP(ARRAY['a', 'b', 'c'], ARRAY[1, 2, 3]), (k, v1, v2) -> k || CAST(v1 / v2 AS VARCHAR)); -- {a -> a1, b -> b4, c -> c9}
- transform_keys(map(K1, V), function(K1, V, K2)) -> map(K2, V)#
Возвращает map, в котором к каждой записи исходного
mapприменяетсяfunctionдля преобразования ключей:SELECT transform_keys(MAP(ARRAY[], ARRAY[]), (k, v) -> k + 1); -- {} SELECT transform_keys(MAP(ARRAY [1, 2, 3], ARRAY ['a', 'b', 'c']), (k, v) -> k + 1); -- {2 -> a, 3 -> b, 4 -> c} SELECT transform_keys(MAP(ARRAY ['a', 'b', 'c'], ARRAY [1, 2, 3]), (k, v) -> v * v); -- {1 -> 1, 4 -> 2, 9 -> 3} SELECT transform_keys(MAP(ARRAY ['a', 'b'], ARRAY [1, 2]), (k, v) -> k || CAST(v as VARCHAR)); -- {a1 -> 1, b2 -> 2} SELECT transform_keys(MAP(ARRAY [1, 2], ARRAY [1.0, 1.4]), (k, v) -> MAP(ARRAY[1, 2], ARRAY['one', 'two'])[k]); -- {one -> 1.0, two -> 1.4}
- transform_values(map(K, V1), function(K, V1, V2)) -> map(K, V2)#
Возвращает map, в котором к каждой записи исходного
mapприменяетсяfunctionдля преобразования значений:SELECT transform_values(MAP(ARRAY[], ARRAY[]), (k, v) -> v + 1); -- {} SELECT transform_values(MAP(ARRAY [1, 2, 3], ARRAY [10, 20, 30]), (k, v) -> v + k); -- {1 -> 11, 2 -> 22, 3 -> 33} SELECT transform_values(MAP(ARRAY [1, 2, 3], ARRAY ['a', 'b', 'c']), (k, v) -> k * k); -- {1 -> 1, 2 -> 4, 3 -> 9} SELECT transform_values(MAP(ARRAY ['a', 'b'], ARRAY [1, 2]), (k, v) -> k || CAST(v as VARCHAR)); -- {a -> a1, b -> b2} SELECT transform_values(MAP(ARRAY [1, 2], ARRAY [1.0, 1.4]), (k, v) -> MAP(ARRAY[1, 2], ARRAY['one', 'two'])[k] || '_' || CAST(v AS VARCHAR)); -- {1 -> one_1.0, 2 -> two_1.4}