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

问题描述 投票:0回答:1

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

举个例子,我有一个table1,我想把它连接到table2,条件是table1.field1在table2.field1yes中,但不在table2.field1no中。

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

  • table1.field1 = '123100'。
    • table2.field1yes ='__100,__200'
    • table2.field2no = Null
  • table1.field1='321300'
    • table2.field1yes = %
    • table2.field1no='__100,__200'

其中_代表单个字符通配符,%代表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)$')

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

join google-bigquery wildcard contains
1个回答
1
投票

下面是针对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表达式的表示方式,并假设其他的问题(加入的逻辑等)由你自己来调整

© www.soinside.com 2019 - 2024. All rights reserved.