Есть ли sql функция для поиска / объединения элементов в массиве? Использование Google BigQuery - PullRequest
2 голосов
/ 10 января 2020

У меня есть таблица, в которой есть поле массива идентификаторов, и я хочу заменить идентификаторы именами, но сохранить его в том же формате массива. У меня есть отдельная таблица поиска с идентификаторами и соответствующими именами. Поскольку это массив, я не могу сделать простое соединение. Я попытался сгладить поле массива, а затем выполнить простое объединение, которое работает, но потом я не знаю, как вернуть его в тот же исходный формат массива. Есть ли лучшие способы сделать это?

enter image description here

Ответы [ 2 ]

4 голосов
/ 10 января 2020

Ниже для BigQuery Standard 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

с результатом

enter image description here

1 голос
/ 10 января 2020

Если у вас есть первичный ключ в таблице, вы можете сгладить массив, а затем сгруппировать обратно по первичному ключу, используя 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 и wanted_id_field позже, чтобы заполнить пробелы идентификаторов, которые не не соответствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...