В Bigquery я могу объединить две таблицы, используя Contains / Not Contains с подстановочными знаками? - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь объединить две таблицы, где значения из первой таблицы необходимо включить в значения в одном поле из второй таблицы, но исключить из значений в другом поле. Все поля не являются строками массива.

Например, у меня есть table1, который я хотел соединить с table2 при условиях, когда table1.field1 находится в table2.field1yes, но не в table2.field1no.

таблица1 имеет строки, которые должны объединяться со строками в таблице2 следующим образом:

  • table1.field1 = '123100'
    • table2.field1yes = '___ 100, ___ 200'
    • table2.field2no = Null
  • table1.field1 = '321300'
    • table2.field1yes =%
    • table2.field1no = '___100, ___ 200 '

Где _ обозначает подстановочный знак из одного символа, а% обозначает подстановочный знак из 0 или более символов

Записанный в коде, я попытался сделать следующее для объединения таблиц в приведенном выше примере:

WITH
  table1  AS (SELECT '123100' field1 UNION ALL
              SELECT '321300'),
  table2  AS (SELECT 'data1' data, 'r\'^([\\d]+100|[\\d]+200)$\'' field1yes, '' field1no UNION ALL
              SELECT 'data2',      'r\'^([0-9A-Za-z])$\'',                   'r\'^([\\d]+100|[\\d]+200)$\'')

SELECT
  *
FROM table1
JOIN table2
ON 0=0
  AND     REGEXP_CONTAINS(table1.field1, table2.field1yes)
  AND NOT REGEXP_CONTAINS(table1.field1, table2.field1no)

Но это не возвращает результатов, даже если следующее возвращает первую строку из таблицы1 как ожидаемый результат:

SELECT
  *
FROM table1
WHERE 0=0
  AND     REGEXP_CONTAINS(table1.field1, r'^([\d]+100|[\d]+200)$')

и следующее возвращает вторую строку из таблицы1:

SELECT
  *
FROM table1
WHERE 0=0
  AND NOT REGEXP_CONTAINS(table1.field1, r'^([\d]+100|[\d]+200)$')


Это т легкий подход? Если да, какие настройки мне нужно внести в мой запрос, чтобы получить результаты? Если нет, есть ли другое решение для сопоставления этих двух таблиц?

1 Ответ

1 голос
/ 02 мая 2020

Ниже для BigQuery Standard SQL

Это правильный подход?

Да, вы можете предварительно настроить регулярное выражение и затем использовать его в функциях REGEXP

Какие настройки мне нужно внести в мой запрос, чтобы получить результаты?

Надеюсь, ниже будет очень ясно, что «не так» в вашем исходном запросе. В основном я имею в виду в TCE для table2 (в частности, field1yes и field1no)

#standardSQL
WITH table1  AS (
  SELECT '123100' field1 UNION ALL
  SELECT '321300'
), table2  AS (
  SELECT 'data1' data, r'^([\d]+100|[\d]+200)$' field1yes, '' field1no UNION ALL
  SELECT 'data2',      r'^([0-9A-Za-z])$',                   r'^([\d]+100|[\d]+200)$'
)
SELECT *
FROM table1
JOIN table2
ON REGEXP_CONTAINS(table1.field1, table2.field1yes)
OR NOT REGEXP_CONTAINS(table1.field1, table2.field1no)    

Примечание: я сосредоточился на устранении основной проблемы с вашим первоначальным запросом, который представлял собой выражения регулярных выражений, и предположил, что остальные (logi c присоединения и т. Д. c.) Зависит от вас, чтобы настроить

...