Sql 如何判断A列是否包含B列中的内容?
我一直在试图找出一种方法来从表a列a中获取信息,与表B列a相比,例如:Sql 如何判断A列是否包含B列中的内容?,sql,google-bigquery,Sql,Google Bigquery,我一直在试图找出一种方法来从表a列a中获取信息,与表B列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表A.A,类似于表B.B,但我认为我缺少了一个部分来实现它 SELECT
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表A.A,类似于表B.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
但是现在我什么也得不到。我相信我错过了一些东西,或者可能是想错了获得所需结果的方法。任何帮助都将不胜感激
-梅基德你很接近了。我认为这将在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进行相等联接——这应该更具可伸缩性。您已经接近了。我认为这将在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进行平等连接——这应该更具可伸缩性。下面是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\u CONTAINS
可以提供正则表达式的强大功能,但有点昂贵,因此您可以使用STRPOS()
,如下例所示
#standardSQL
SELECT *
FROM `project.dataset.tableA`
CROSS JOIN `project.dataset.tableB`
WHERE STRPOS(Name, id) > 0
快速更新:
我刚刚意识到,在你的问题中,id
不是字符串,而是INT,所以:
REGEXP\u CONTAINS(Name,id)
应替换为REGEXP\u CONTAINS(Name,CAST(id AS STRING))
对于STRPOS(名称、id)以下是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\u CONTAINS
可以提供正则表达式的强大功能,但有点昂贵,因此您可以使用STRPOS()
,如下例所示
#standardSQL
SELECT *
FROM `project.dataset.tableA`
CROSS JOIN `project.dataset.tableB`
WHERE STRPOS(Name, id) > 0
快速更新:
我刚刚意识到,在你的问题中,id
不是字符串,而是INT,所以:
REGEXP\u CONTAINS(Name,id)
应替换为REGEXP\u CONTAINS(Name,CAST(id AS STRING))
对于STRPOS(Name,id)也一样,考虑到您的数据结构,这样做可能会有所帮助(注意
SAFE\u CAST
的应用):
考虑到您的数据结构,这样做可能会有所帮助(注意
SAFE\u CAST
的应用):
这正是我所需要的,而且两者都很好,谢谢!!这正是我所需要的,而且两者都很好,谢谢!!两个版本都非常适合我,我希望我能给出多个正确答案,因为两个版本都适用!非常感谢你!两个版本都非常适合我,我希望我能给出多个正确答案,因为两个版本都适用!非常感谢你!