Как вы можете выяснить, содержит ли столбец A что-то из столбца B? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытался найти способ получить информацию из столбца A таблицы A по сравнению с столбцом A таблицы B, например:

TableA
Name
abcd_1234_efgh
zxcdde_gets_3214_
jkil_uelso_5555_aseil
uuuu_kkkk_iiii_3333

TableB
ID    
1234          
3214           
5555      
3333

Я пытался выполнить INNER JOIN из таблицыОт A до Таблицы B затем выполняю WHERE TableA.A, как TableB.B, но я думаю, что мне не хватает раздела, чтобы заставить его работать.

SELECT
    a.Name,
    b.ID
FROM
    TableA a

INNER JOIN
    TableB b
ON
    a.Name LIKE CAST(b.ID AS STRING)

Результат, который я хочу получить:

Name                      ID
abcd_1234_efgh            1234
zxcdde_gets_3214_         3214
jkil_uelso_5555_aseil     5555
uuuu_kkkk_iiii_3333       3333

Но в настоящее время я ничего не получаю в результате.Я полагаю, что что-то упустил или, возможно, думаю о неправильном пути получения необходимого результата.Любая помощь будет принята с благодарностью!

-Maykid

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT *
FROM `project.dataset.tableA`
CROSS JOIN `project.dataset.tableB`
WHERE REGEXP_CONTAINS(Name, id)   

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

#standardSQL
WITH `project.dataset.tableA` AS (
  SELECT 'abcd_1234_efgh' Name UNION ALL
  SELECT 'zxcdde_gets_3214_' UNION ALL
  SELECT 'jkil_uelso_5555_aseil' UNION ALL
  SELECT 'uuuu_kkkk_iiii_3333' 
),  `project.dataset.tableB` AS (
  SELECT '1234' id UNION ALL          
  SELECT '3214' UNION ALL           
  SELECT '5555' UNION ALL      
  SELECT '3333' 
)
SELECT *
FROM `project.dataset.tableA`
CROSS JOIN `project.dataset.tableB`
WHERE REGEXP_CONTAINS(Name, id)   

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

Row Name                    id   
1   abcd_1234_efgh          1234     
2   zxcdde_gets_3214_       3214     
3   jkil_uelso_5555_aseil   5555     
4   uuuu_kkkk_iiii_3333     3333     

Примечание: использование REGEXP_CONTAINS дает вам довольно много регулярных выражений, но это немного дороже, поэтому вместо этого вы можете использовать STRPOS(), как в примере ниже

#standardSQL
SELECT *
FROM `project.dataset.tableA`
CROSS JOIN `project.dataset.tableB`
WHERE STRPOS(Name, id) > 0   

БыстрыйОбновление:

Я только что понял, что id не является STRING, а скорее INT в вашем вопросе - так:

REGEXP_CONTAINS(Name, id) следует заменить на REGEXP_CONTAINS(Name, CAST(id AS STRING))
и то же самое для STRPOS(Name, id)

0 голосов
/ 12 февраля 2019

Учитывая вашу структуру данных, может быть что-то вроде этого помогает (обратите внимание на применение SAFE_CAST):

select name, c, t2.number from (
  select t1.name, split(t1.name, "_") splitted from TableA t1
), unnest(splitted) c
left join TableB t2 on t2.number = SAFE_CAST(c as int64)
where number is not null
0 голосов
/ 11 февраля 2019

Вы рядом.Я думаю, что это будет работать в BigQuery:

SELECT a.Name, b.ID
FROM TableA a INNER JOIN
     TableB b
     ON a.Name LIKE CONCAT('%', CAST(b.ID AS STRING), '%');

Но вы действительно можете захотеть:

SELECT a.Name, b.ID
FROM TableA a CROSS JOIN
     UNNEST(SPLIT(a.Name, '_')) namepart JOIN 
     TableB b
     ON namepart = CAST(b.ID AS STRING);

Это похоже на каждую часть имени в отдельности и позволяет BigQuery выполнять соединение равенства -- который должен быть более масштабируемым.

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