使用计数表访问数组元素:
数据:
CREATE OR REPLACE TABLE t
AS
SELECT PARSE_JSON('[1466369, 1466369, 1466369, 1466369, 1466369, 1466369, 1466369]') AS orders,
PARSE_JSON ('[17083, 40052, 173810, 71874, 104769, 121607, 47652]') AS part,
PARSE_JSON ('[9000.72, 9920.5, 11302.86, 18458.7, 26606.4, 27686.2, 36791.95]') AS price;
查询:
SELECT orders[s.t]::INT AS orders, part[s.t]::INT AS part, price[s.t] AS price
FROM t
LEFT JOIN (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS s(t)
ON s.t < GREATEST(ARRAY_SIZE(t.orders), ARRAY_SIZE(t.part), ARRAY_SIZE(t.price));
输出:
或者:
SELECT s1.index, s1.value, s2.value, s3.value
FROM t
,TABLE(FLATTEN(t.orders)) s1
,TABLE(FLATTEN(t.part)) s2
,TABLE(FLATTEN(t.price)) s3
WHERE s1.INDEX = s2.INDEX
AND s2.INDEX = s3.INDEX;
输出:
虽然这种方法会爆炸得非常快 size_array_1 * size_array_2 * size_array_3。
编辑:
我尝试在其中一个数组值中放置一个 null(未定义)值,当我这样做时 - 查询不会返回具有 null 作为列值之一的行(返回 6 行而不是 7 ) .有没有办法解决这个问题
CREATE OR REPLACE TABLE t
AS
SELECT PARSE_JSON('[1466369, null, 1466369, 1466369, 1466369, 1466369, 1466369]') AS orders,
PARSE_JSON ('[17083, 40052, 173810, 71874, 104769, 121607, 47652]') AS part,
PARSE_JSON ('[9000.72, 9920.5, 11302.86, 18458.7, 26606.4, 27686.2,36791.95]') AS price;
查询:
SELECT s1.index, s1.value, s2.value, s3.value
FROM t
,TABLE(FLATTEN(t.orders, OUTER=> TRUE)) s1
,TABLE(FLATTEN(t.part, OUTER=> TRUE)) s2
,TABLE(FLATTEN(t.price, OUTER=> TRUE)) s3
WHERE s1.INDEX = s2.INDEX
AND s2.INDEX = s3.INDEX;
输出: