Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何判断A列是否包含B列中的内容?_Sql_Google Bigquery - Fatal编程技术网

Sql 如何判断A列是否包含B列中的内容?

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

我一直在试图找出一种方法来从表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
    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
的应用):


这正是我所需要的,而且两者都很好,谢谢!!这正是我所需要的,而且两者都很好,谢谢!!两个版本都非常适合我,我希望我能给出多个正确答案,因为两个版本都适用!非常感谢你!两个版本都非常适合我,我希望我能给出多个正确答案,因为两个版本都适用!非常感谢你!