我试图连接两个表,其中第一个表的值需要包含在第二个表的一个字段中,但不包括在另一个字段中。所有字段都是非数组字符串。
举个例子,我有一个table1,我想把它连接到table2,条件是table1.field1在table2.field1yes中,但不在table2.field1no中。
table1中的行应该与table2中的行连接,如下所示。
其中_代表单个字符通配符,%代表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函数中使用它。
我需要对我的查询进行哪些调整才能返回结果?
我希望下面的内容能让你很清楚地知道你的原始查询中的 "错误 "所在。我主要是指在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)
注意:我重点解决了你最初查询的主要问题,也就是regexp表达式的表示方式,并假设其他的问题(加入的逻辑等)由你自己来调整