【发布时间】:2021-10-09 17:14:05
【问题描述】:
假设我有数组 ['1', '2', '3'] 和 ['a', 'b', 'c', 'd'],我想映射它们
select map(array ['1', '2', '3'], array ['a', 'b', 'c', 'd'])
这将返回一个错误,指出数组需要具有相同的长度。
如何复制 python 的zip(),它会丢弃没有配对的那些?或者如果没有,用 NULL 填充缺失的部分?
【问题讨论】:
假设我有数组 ['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 的 cmets 中指出的那样,您可以通过索引访问行字段,因此您可以将相应的行更改为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} |
【讨论】:
r -> r[1] IS NOT NULL