【发布时间】:2020-04-28 08:46:34
【问题描述】:
我有一个表,其中有一个 id 数组字段,我想用名称替换 id,但保持相同的数组格式。 我有一个单独的“查找”表,其中包含 id 及其对应的名称。 由于它是一个数组,我无法进行简单的连接。 我试过展平数组字段,然后做一个简单的连接 - 这很有效 - 但我不知道如何将它放回相同的原始数组格式。有没有更好的方法来做到这一点?
【问题讨论】:
标签: sql arrays google-bigquery
我有一个表,其中有一个 id 数组字段,我想用名称替换 id,但保持相同的数组格式。 我有一个单独的“查找”表,其中包含 id 及其对应的名称。 由于它是一个数组,我无法进行简单的连接。 我试过展平数组字段,然后做一个简单的连接 - 这很有效 - 但我不知道如何将它放回相同的原始数组格式。有没有更好的方法来做到这一点?
【问题讨论】:
标签: sql arrays google-bigquery
以下是 BigQuery 标准 SQL
#standardSQL
CREATE TEMP FUNCTION VLOOKUP(expr ANY TYPE, map ANY TYPE) AS ((
IFNULL((SELECT name FROM UNNEST(map) WHERE id = expr), expr)
));
WITH `project.dataset.table` AS (
SELECT 'aaa' other_fields, [STRUCT('456' AS id_field), STRUCT('3367'), STRUCT('xyz')] AS array_fields UNION ALL
SELECT 'bbb', [STRUCT('56'), STRUCT('89')] UNION ALL
SELECT 'ccc', [STRUCT('40'), STRUCT('768'), STRUCT('8766'), STRUCT('abc')]
), `project.dataset.lookup_table` AS (
SELECT '456' id, 'A' name UNION ALL
SELECT '56', 'B' UNION ALL
SELECT '89', 'C' UNION ALL
SELECT '40', 'D'
)
SELECT t.* REPLACE(
ARRAY(
SELECT AS STRUCT id_field, VLOOKUP(id_field, kv) AS desired_new_field
FROM t.array_fields
) AS array_fields
)
FROM `project.dataset.table` t,
(SELECT ARRAY_AGG(STRUCT(id, name)) AS kv FROM `project.dataset.lookup_table`) arr
结果
【讨论】:
如果表中有主键,则可以展平数组,然后使用 ARRAY_AGG 重新组合主键以重建数组。 如果没有主键,您仍然可以对数组元素进行 INNER JOIN(但不能 OUTER JOIN),即
SELECT
ARRAY(
SELECT STRUCT<id_field string, desired_id_field string>(id_field, desired_id_field)
FROM UNNEST(id_field) id_field
INNER JOIN lookup_table
ON id_field = lookup_table.names)
FROM main_table
您仍然需要稍后合并 id_field 和 desired_id_field 以填补不匹配的 id 的空白。
【讨论】: