我想查询两个表,具体取决于条件,并且想要生成标记,如图所示是/可能
为了显示上述结果,我正在使用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
。
任何有用的帮助 谢谢
答案 0 :(得分:1)
在高级别,我建议如下思考这个问题:
对于第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
,我得到了上述问题的预期结果
但它会产生令人讨厌的结果,如
第246行是好的,但第241行给出了错误的结果,标签必须为是。 得到这个结果后,我想对第242和243行进行优化。