【问题标题】:Is there a sql function to lookup/join elements within an array? Using Google BigQuery是否有一个 sql 函数来查找/连接数组中的元素?使用 Google BigQuery
【发布时间】:2020-04-28 08:46:34
【问题描述】:

我有一个表,其中有一个 id 数组字段,我想用名称替换 id,但保持相同的数组格式。 我有一个单独的“查找”表,其中包含 id 及其对应的名称。 由于它是一个数组,我无法进行简单的连接。 我试过展平数组字段,然后做一个简单的连接 - 这很有效 - 但我不知道如何将它放回相同的原始数组格式。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: sql arrays google-bigquery


    【解决方案1】:

    以下是 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
    

    结果

    【讨论】:

      【解决方案2】:

      如果表中有主键,则可以展平数组,然后使用 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 的空白。

      【讨论】:

        猜你喜欢
        • 2021-08-05
        • 2021-09-21
        • 1970-01-01
        • 2021-12-30
        • 2019-05-23
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多