您如何确定A列中是否包含B列中的内容?

时间:2019-02-11 16:30:17

标签: sql google-bigquery

例如,我一直在尝试从表A列A中获取信息的方法,例如:

TableA
Name
abcd_1234_efgh
zxcdde_gets_3214_
jkil_uelso_5555_aseil
uuuu_kkkk_iiii_3333

TableB
ID    
1234          
3214           
5555      
3333

我尝试过从表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 :(得分:3)

您很近。我认为这将在BigQuery中起作用:

awk -F':' 'BEGIN{print "<table border=1 cellpadding=1 cellspacing=0 bordercolor=BLACK>
<tr>
    <td>Environment</td>
    <td>Default Shell</td>
</tr>"}{ print "
<tr>
    <td>"$success"</td>
    <td>"$(NF)"</td>
</tr>"$(NF)"</td></tr>"}END { print "</table>" } ' /var/tmp/pid_test.sh

但是您可能真的想要:

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

这看起来像是名称的各个部分,并允许BigQuery进行相等连接-应该具有更大的可扩展性。

答案 1 :(得分:1)

以下是用于BigQuery标准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)

相同

答案 2 :(得分:0)

鉴于您的数据结构,也许这样会有所帮助(请注意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