在 Bigquery 中,我可以使用 Contains/Not Contains 和通配符连接两个表吗?

In Bigquery can I join two tables using Contains/Not Contains with wildcards?

我正在尝试连接两个 table,其中第一个 table 的值需要包含在第二个 table 的一个字段的值中,但不包括在第二个 table 的值中不同的领域。所有字段都是非数组字符串。

例如,我有 table1,我想在 table1.field1 位于 table2.field1yes 的条件下加入 table2但不在 table2.field1no.

table1 的行应与 table2 中的行连接,如下所示:

其中_代表单个字符通配符,%代表0个或多个字符通配符

用代码编写,我尝试执行以下操作以加入上面示例中的 tables:

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)

但它 return 没有结果,即使下面的 returns 来自 table1 的第一行是预期的结果:

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

和下面的 returns 从 table1 开始的第二行:

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


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

以下适用于 BigQuery 标准 SQL

Is this the right approach?

是的,您可以预设您的正则表达式,然后在 REGEXP 函数中使用它

what tweaks do I need to make to my query to return results?

我希望下面能清楚地说明您最初查询中的 "wrong" 是什么。我主要是指在 TCE 中用于 table2(特别是 field1yes 和 field1no)

#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)    

注意:我专注于解决您的初始查询的主要问题,这是正则表达式的表示,并假设其余的(连接逻辑等)由您调整