比较Google BigQuery中的子字符串

时间:2014-03-21 11:17:20

标签: mysql sql google-bigquery

我想查询两个表,具体取决于条件,并且想要生成标记,如图所示是/可能 for generating the following result the query is

为了显示上述结果,我正在使用if(places.name CONTAINS poi.name 'Yes','Maybe'),但问题是:在第i行的图像中。 4 poi_name包含值surana.agen,其各自的列places_type的值为[W1]Surana.Agency,因此我希望Tag而不是可能。  poi_name列可以包含任何特殊字符,例如dot(。)我想将列值拆分为存在的特殊字符,在这种情况下我想搜索surana或{{1存在于agen

任何有用的帮助 谢谢

3 个答案:

答案 0 :(得分:1)

在高级别,我建议如下思考这个问题:

  • 步骤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。

答案 1 :(得分:0)

我对以上图片的查询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 :(得分:0)

通过将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,我得到了上述问题的预期结果 但它会产生令人讨厌的结果,如enter image description here

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