sql bigquery中的正则表达式联接

20jt8wwn  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(567)

我正在设置一个数据集,其中我使用一个主表,其中包含销售人员的姓名、连锁店的id和名称以及他们拥有的每个品牌的名称,如以下示例数据:

salesperson  chain_id  chain_name        brand_name
pepito          28      chairs4all          sitnice
jaimito         34      eatdrinkeat         Drink & eat
pepito          28      chairs4all          AwwwChairs!
susanita        56      something           Anything
jaimito         567     last                 One

在另一个表中,我有一个列,上面有每个商店的名称,我想将每个商店附加到它的品牌上。但存储名称可能会附加位置或其他信息,如来自另一个表的示例数据:

store_name
sitnice
AwwwChairs! Seville
One 34
SitNice nº12
Drink & eat North road 23

我想要最后一张这样的table:

salesperson  chain_id  chain_name        brand_name        store_name
pepito          28      chairs4all          sitnice          sitnice
jaimito         34      eatdrinkeat         Drink & eat   Drink & eat North     
pepito          28      chairs4all          AwwwChairs!   AwwwChairs! Seville    
susanita        56      something           Anything          null
jaimito         567     last                 One               one 34
pepito          28      chairs4all          sitnice          SitNice nº12

所以我想我必须把商标名和商店名这两个表连接起来。我试过这个:

SELECT brand_name, salesperson, chain_name, chain_id, store_name   
FROM data
    cross join
     data2
    where
    brand_name like CONCAT('%', store_name,'%')

这没有返回预期结果。它返回的记录比预期的要少,并且只匹配一些预期的记录。我还尝试了regexp\u contains并强制另一个连接,但由于我没有其他字段可以连接,所以效果非常差。谢谢

6rqinv9w

6rqinv9w1#

使用您的示例数据,我能够创建一个标准的sql查询来实现所需的输出。我在bigquery中上传了两个表,其中一个叫做 chain_name 第二张table呢 store_name 分别使用共享的第一块和第二块数据。
为了交叉连接两个表 brand_name 在里面 store_name (除了品牌名称外,还可能包含商店的地址),我使用了having子句,它过滤掉在对bool表达式求值时不返回true的行。此外,regex_contains()如果分析的表达式是部分匹配的,则返回true。
下面是问题,

SELECT salesperson, chain_id, chain_name, brand_name, store_name FROM `project_id.dataset.store_name` 
CROSS JOIN `project_id.dataset.chain_name`
GROUP BY 1,2,3,4,5
HAVING REGEXP_CONTAINS(lower(store_name),lower(brand_name))
ORDER BY chain_id

以及输出,

Row salesperson chain_id    chain_name  brand_name  store_name
1   pepito      28          chairs4all  sitnice     sitnice
2   pepito      28          chairs4all  AwwwChairs! AwwwChairs! Seville
3   pepito      28          chairs4all  sitnice     SitNice nº12
4   jaimito     34          eatdrinkeat Drink & eat Drink & eat North road 23
5   jaimito     567         last        One         One 34

请注意,lower()用于匹配名称,尽管可能存在一些小写字母/标题字母的差异。

相关问题