假设我有数组
['1', '2', '3']
和 ['a', 'b', 'c', 'd']
,我想映射它们
select map(array ['1', '2', '3'], array ['a', 'b', 'c', 'd'])
这将返回一个错误,指出数组需要具有相同的长度。
我怎样才能复制Python的
zip()
,它会丢弃那些没有成对的东西?或者如果没有,用 NULL 填充缺失的部分?
您可以使用
slice
和 cardinality
来“固定”尺寸:
WITH dataset AS (
SELECT *
FROM
(
VALUES
(ARRAY [1, 2, 3], ARRAY[1, 2, 3, 4])
) AS t (arr1, arr2)
)
SELECT
map (
slice(arr1, 1, m),
slice(arr2, 1, m)
)
FROM
(
SELECT *, LEAST(cardinality(arr1), cardinality(arr2)) as m
FROM
dataset
)
输出:
_col0 |
---|
{1=1, 2=2, 3=3} |
或者只是使用
zip
并将 ROW
的结果数组转换为映射(注意,这依赖于 ROW
元素的默认命名约定,正如 @Martin Traverso 在 Trino 的注释中指出的那样,您可以通过索引访问行字段,因此您可以将相应的行更改为 r -> r[1] IS NOT NULL
):
WITH dataset AS (
SELECT * FROM (VALUES
(ARRAY [1,2,3], ARRAY[1,2,3,4])
) AS t (arr1, arr2))
SELECT map_from_entries(filter(zip(arr1, arr2), r -> r.field0 is not NULL))
FROM dataset
输出:
_col0 |
---|
{1=1, 2=2, 3=3} |