【问题标题】:Comparing substrings in Google BigQuery比较 Google BigQuery 中的子字符串
【发布时间】:2014-04-28 17:36:57
【问题描述】:

我想根据条件查询这两个表并想要生成标签,如您在图像中看到的那样/也许

为了显示上述结果,我使用if(places.name CONTAINS poi.name 'Yes','Maybe'),但问题是:在第 1 行的图像中。 4 poi_name 包含值 surana.agen 并且其各自的列 places_type 具有值 [W1]Surana.Agency 因此我希望 TagYes 而不是 Maybe . poi_name 列可以包含任何特殊字符,例如此处的点(。)我想通过出现的任何特殊字符来拆分列值,在这种情况下,我想搜索 @ 中的 suranaagen 987654331@.

任何有用的帮助 谢谢

【问题讨论】:

  • 到目前为止你尝试了什么?展示你的一些实际工作!
  • 上图只是我对 poi 和 places 表的查询结果

标签: mysql sql google-bigquery


【解决方案1】:

我对上图ios的查询

SELECT a.id as ID, 
a.lattitude as poi_lat,
b.latitude as places_lat,
a.longitude as poi_long,
b.longitude as places_long,
a.name as poi_name,
a.comment as poi_comment,
b.name as places_name,
b.type as places_type,
if(b.name CONTAINS a.name 
AND b.lat_approximate = a.lat_approximate 
AND b.long_approximate = a.long_approximate, 
'Yes', 
if(b.lat_approximate = a.lat_approximate 
AND b.long_approximate = a.long_approximate, 'Maybe','No') 
) as Tag
FROM [grayrout_graycover.poientry_test] a
LEFT OUTER JOIN EACH [grayrout_graycover.placesdetails] b
ON a.lat_approximate = b.lat_approximate AND a.long_approximate = b.long_approximate 
WHERE b.type='P&G'
ORDER BY a.id;

【讨论】:

    【解决方案2】:

    通过将 select 子句中的条件更改为 if(UPPER(b.name) CONTAINS UPPER(REGEXP_REPLACE(a.name, r'\.\w*', ''))OR UPPER(b.name) CONTAINS UPPER(a.name) AND b.lat_approximate = a.lat_approximate AND b.long_approximate = a.long_approximate AND b.type='P&G', 'Yes', if(b.lat_approximate = a.lat_approximate AND b.long_approximate = a.long_approximate AND b.type='P&G', 'May be','Not') ) as Tag,我得到了上述问题的预期结果 但它给出了令人讨厌的结果如下

    第 246 行没问题,但第 241 行给出错误结果,标签必须为是。 得到这个结果后,我想针对第 242 行和第 243 行对其进行优化。

    【讨论】:

    • 考虑将 IF 语句中的每个条件拆分为结果中的单独列。通过这种方式,您可以获得有关表达式为何按照观察到的评估的更多信息。还可以考虑为 AND 和 OR 子句加上括号,以确保获得预期的结果。
    • 我检查的条件很好,有些地方工作正常,我认为他们的数据有问题
    • 我的意思是他们在 BigQuery 中是否支持任何自然语言,可以比较两个字符串并获得某种百分比匹配,以便我们可以预测两个字符串有多少相同,例如。在我上面的图片中,第 242,243 行 Medical 与 Medicals 进行比较,这将给出百分比匹配让说 99% 检查链接:dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
    • 不,BigQuery 尚不支持自然语言或“模糊”字符串匹配。但是,您提出的问题应该可以在 BigQuery 中解决。根据您的帖子,我没有足够的信息进行调试,但我怀疑您可以通过测试较小的表达式来找到解决方案。
    【解决方案3】:

    在高层次上,我建议按如下方式思考这个问题:

    • 第 1 步:将 poi_name 拆分为要匹配的子字符串。
    • 第 2 步:检查这些子字符串中的任何一个是否包含在 places_name 中。

    对于第 1 步,很难在 SQL 中拆分任意数量的子字符串。但是,如果您有一些限制(例如,最多 3 个子字符串),您可以使用 REGEXP_EXTRACT 将它们拉出。例如:

     REGEXP_EXTRACT(poi_name, r'([^.]*)') AS first,
     REGEXP_EXTRACT(poi_name, r'[^.]*\.([^.]*)') AS second,
     REGEXP_EXTRACT(poi_name, r'[^.]*\.[^.]*\.([^.]*)') AS third,
    

    幸运的是,第 2 步很简单。提取这些字符串后,使用 CONTAINS 测试它们是否在 places_name 中。

    我不确定您对输入有多少控制权,但您可以考虑提前将 poi_name 拆分为单独的字段或重复的字段,因为这样可以避免对每个查询运行 REGEXP_EXTRACT。

    【讨论】:

      猜你喜欢
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多