在 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 中的行连接,如下所示:
- table1.field1 = '123100'
- table2.field1yes = '___100,___200'
- table2.field2no = Null
- table1.field1 = '321300'
- table2.field1yes = %
- table2.field1no = '___100,___200'
其中_代表单个字符通配符,%代表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)
注意:我专注于解决您的初始查询的主要问题,这是正则表达式的表示,并假设其余的(连接逻辑等)由您调整
我正在尝试连接两个 table,其中第一个 table 的值需要包含在第二个 table 的一个字段的值中,但不包括在第二个 table 的值中不同的领域。所有字段都是非数组字符串。
例如,我有 table1,我想在 table1.field1 位于 table2.field1yes 的条件下加入 table2但不在 table2.field1no.
table1 的行应与 table2 中的行连接,如下所示:
- table1.field1 = '123100'
- table2.field1yes = '___100,___200'
- table2.field2no = Null
- table1.field1 = '321300'
- table2.field1yes = %
- table2.field1no = '___100,___200'
其中_代表单个字符通配符,%代表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)
注意:我专注于解决您的初始查询的主要问题,这是正则表达式的表示,并假设其余的(连接逻辑等)由您调整