Объединить, где значение одной таблицы в списке значений из другой таблицы - PullRequest
0 голосов
/ 10 февраля 2020

В BigQuery у меня есть table1, который имеет (не обнуляемый) столбец id, который всегда представляет собой целое число 5-ди git. Я хочу присоединить его к table2, в котором также есть столбец id, представляющий собой (обнуляемые) строки с теми же идентификаторами.

Проблема в том, что id в table2 также может быть списком разделенных '/' идентификаторов.

Вот пример столбца:

82795 
82795
NULL 
84660 
84120 / 82795 
73844 / 73845 
73844 / 73845 
NULL
83793 / 84758 
73844 / 73845 / 84122 / 84136 
73844 / 73845 / 84136 
84845

Как мне добиться чего-то подобного с логиками c to:

SELECT * FROM table1
LEFT JOIN table2
ON table1.id IN SPLIT(table2.id, ' / ')

Ответы [ 3 ]

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

Я согласен с тем, что Тим говорит о нормализации вашей таблицы, но тем временем вы сможете использовать IN с UNNEST для поиска результатов SPLIT:

SELECT * FROM table1
LEFT JOIN table2
ON table1.id IN UNNEST(SPLIT(table2.id, ' / '))
0 голосов
/ 10 февраля 2020

Я согласен с Ником, но я думаю, что эта версия лучше работает в BigQuery:

with table1 as (
       select 82795 as id union all
       SELECT 1234 UNION ALL
       SELECT 84122
     ),
     table2 as (
       SELECT '84120 / 82795' as id UNION ALL
       SELECT '73844 / 73845 / 84122 / 84136'
     )
SELECT t1, t2
FROM table1 t1 LEFT JOIN 
     (table2 t2 CROSS JOIN
      UNNEST(SPLIT(t2.id, ' / ')) t2id
     )
     ON t1.id = safe_cast(t2id as int64);

(работает выше)

Примечания:

  • BigQuery жалуется, когда я не использую = для LEFT JOIN.
  • Я предполагаю, что table1.id - это число. Для сравнения необходимо преобразовать строку.
  • Повторяющиеся имена столбцов не допускаются в SELECT, поэтому SELECT * не работает. Простой обходной путь - выбрать значения в виде записей, а не столбцов.
0 голосов
/ 10 февраля 2020

Вам следует подумать о нормализации вашей второй таблицы, чтобы каждое значение id отображалось в отдельной записи. В качестве обходного пути к вашей текущей ситуации вы можете попробовать следующее:

SELECT *
FROM table1 t1
LEFT JOIN table2 t2
    ON CONCAT(' ', t2.id, ' ') LIKE CONCAT('% ', CAST(t1.id AS STRING), ' %');

Вышеприведенное предложение ON - это трюк, который ищет таблицу1 id где-нибудь в таблице2 id. Он работает, заполняя последний пробелами, так что нам нужно только найти таблицу1 id, окруженную пробелами.

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