如何为any_match和contains函数添加多参数实现数组匹配
实现数组多条件任一匹配的正确方式
原始数据
| id | region |
|---|---|
| 1 | LAX |
| 1 | LAS |
你用来生成每个ID关联区域数组的语句是没问题的:
ARRAY_SORT(ARRAY_DISTINCT(ARRAY_AGG(region))) as all_regions
你之前写法的问题
any_match(all_regions, s -> s like '%LAS%',e -> e like '%RNO%'):any_match只接受数组和单个lambda表达式两个参数,不能传多个lambdaany_match(all_regions, s -> s like '%LAS%' or '%RNO%'):'%RNO%'是字符串,不是布尔判断,逻辑不成立,得对每个条件都写完整的匹配表达式contains(all_regions, 'LAX' or 'RNO'):SQL里'LAX' or 'RNO'不是合法的字符串逻辑,contains只能检查单个元素是否存在
正确实现方式
方式1:用any_match+多条件OR
在单个lambda里把所有匹配条件用OR连接,只要数组里有任意元素满足其中一个条件就返回true:
-- 模糊匹配(支持通配符) any_match(all_regions, s -> s like '%LAS%' OR s like '%RNO%') as has_target_region -- 精确匹配 any_match(all_regions, s -> s = 'LAS' OR s = 'RNO') as has_target_region
方式2:contains+多条件OR
如果是精确匹配,也可以直接把多个contains用OR连起来,逻辑更直观:
contains(all_regions, 'LAS') OR contains(all_regions, 'RNO') as has_target_region
方式3:数组交集(适合大量目标值)
如果要匹配的区域很多,把目标值做成数组,通过检查交集是否非空来判断:
-- 注意要和all_regions的类型一致,这里假设是varchar数组 array_intersection(all_regions, ARRAY['LAS', 'RNO']) != ARRAY[]::varchar[] as has_target_region
测试结果
以你的示例数据为例,all_regions是[LAS, LAX],以上三种方式都会返回true;如果有ID的关联区域是[SEA],则返回false。
内容的提问来源于stack exchange,提问作者Maggie Liu
相关产品推荐
相关产品推荐

