例如,我一直在尝试从表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
答案 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