Join 在Bigquery中,我可以使用包含/不包含通配符连接两个表吗?

Join 在Bigquery中,我可以使用包含/不包含通配符连接两个表吗?,join,google-bigquery,wildcard,contains,Join,Google Bigquery,Wildcard,Contains,我试图连接两个表,其中第一个表中的值需要包含在第二个表的一个字段中的值中,但不包含在另一个字段中的值中。所有字段都是非数组字符串 例如,我有一个表1,我想在表1.field1位于表2.field1是但不在表2.field1否的条件下加入表2 表1中的行应与表2中的行连接,如下所示: 表1.1字段1='123100' 表2.FIELD1是='\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu200' 表2.2字段2否=空 表1.1字段1='321300' 表2.1字段1

我试图连接两个表,其中第一个表中的值需要包含在第二个表的一个字段中的值中,但不包含在另一个字段中的值中。所有字段都是非数组字符串

例如,我有一个表1,我想在表1.field1位于表2.field1是但不在表2.field1否的条件下加入表2

表1中的行应与表2中的行连接,如下所示:

  • 表1.1字段1='123100'
    • 表2.FIELD1是='\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu200'
    • 表2.2字段2否=空
  • 表1.1字段1='321300'
    • 表2.1字段1是=%
    • 表2.field1no='\uuuuuuuuuuuuuuuuuuuuuuuuuuu200'
其中u表示单字符通配符,%表示0个或多个字符通配符

以代码编写,我尝试执行以下操作来联接上述示例中的表:

WITH
  table1  AS (SELECT '123100' field1 UNION ALL
              SELECT '321300'),
  table2  AS (SELECT 'data1' data, 'r\'^([\\d]+100|[\\d]+200)$\'' field1yes, '' field1no UNION ALL
              SELECT 'data2',      'r\'^([0-9A-Za-z])$\'',                   'r\'^([\\d]+100|[\\d]+200)$\'')

SELECT
  *
FROM table1
JOIN table2
ON 0=0
  AND     REGEXP_CONTAINS(table1.field1, table2.field1yes)
  AND NOT REGEXP_CONTAINS(table1.field1, table2.field1no)
但它不返回任何结果,即使以下内容确实会按预期返回表1中的第一行结果:

SELECT
  *
FROM table1
WHERE 0=0
  AND     REGEXP_CONTAINS(table1.field1, r'^([\d]+100|[\d]+200)$')
下面返回表1中的第二行:

SELECT
  *
FROM table1
WHERE 0=0
  AND NOT REGEXP_CONTAINS(table1.field1, r'^([\d]+100|[\d]+200)$')


这是正确的方法吗?如果是这样,我需要对查询进行哪些调整才能返回结果?如果没有,是否有不同的解决方案来匹配这两个表?

下面是针对BigQuery标准SQL的

这是正确的方法吗

是的,您可以预设regexp,然后在regexp函数中使用它

我需要对查询进行哪些调整才能返回结果

我希望下面能够很清楚地说明您最初的查询中的“错误”是什么。我的主要意思是在表2的TCE中(具体地说,字段1是和字段1否)


注意:我重点解决了初始查询的主要问题,它是regexp表达式的表示形式,并假设其余部分(连接逻辑等)由您来调整,这似乎完成了我的查询的技巧--谢谢!非常感谢。
#standardSQL
WITH table1  AS (
  SELECT '123100' field1 UNION ALL
  SELECT '321300'
), table2  AS (
  SELECT 'data1' data, r'^([\d]+100|[\d]+200)$' field1yes, '' field1no UNION ALL
  SELECT 'data2',      r'^([0-9A-Za-z])$',                   r'^([\d]+100|[\d]+200)$'
)
SELECT *
FROM table1
JOIN table2
ON REGEXP_CONTAINS(table1.field1, table2.field1yes)
OR NOT REGEXP_CONTAINS(table1.field1, table2.field1no)