Presto DB两表关联时数组列元素不匹配的SQL写法问题
错误原因
你写的t1.val1 not in t2.vals条件无法生效的核心原因是:
val1和vals都是字符串数组类型,而NOT IN语法仅支持判断单个标量值是否存在于值列表中,无法直接对两个数组做元素级的存在性校验。
正确写法
Presto内置了数组交集判断函数arrays_overlap(array1, array2),函数返回布尔值:当两个数组存在至少一个公共元素时返回true,无公共元素时返回false。
你的筛选逻辑是同user_id下,t1.val1的元素都不在t2.vals中,本质就是两个数组没有交集,对arrays_overlap的结果取反即可,修正后的SQL如下:
select t1.user_id, t1.val1, t2.vals from tab1 as t1 join tab2 as t2 on t1.user_id = t2.user_id and not arrays_overlap(t1.val1, t2.vals)
结果校验
用给出的样例数据验证逻辑:
- user_id='abh':t1.val1为
['568'],t2.vals为['568', '710', '281'],存在公共元素'568',arrays_overlap返回true,取反后条件不成立,该行被过滤 - user_id='yvg':t1.val1为
['901'],t2.vals为['115', '207'],无公共元素,arrays_overlap返回false,取反后条件成立,该行被返回,完全匹配预期结果。
注意:如果业务中val1或vals数组可能包含null值,可以根据需求搭配
coalesce函数处理null场景,避免返回非预期的null结果。
内容的提问来源于stack exchange,提问作者user3448011
相关产品推荐
相关产品推荐

