PostgreSQL转PrestoSQL查询报错:&&运算符及数组语法不兼容
将PostgreSQL查询转换为PrestoSQL的修正方案
你的查询在Presto中报错,核心原因是Presto与PostgreSQL在数组相关语法、函数支持上存在差异,以下是针对性的修正方案及完整可用查询:
核心差异点修正
- 替换
string_to_array函数:Presto没有string_to_array,使用split(字符串, 分隔符)可实现相同的字符串转数组功能 - 替换PostgreSQL数组构造语法:Presto不支持
::text[]类型转换写法,改用ARRAY['元素1','元素2',...]直接构造字符串数组 - 替换数组交集运算符
&&:Presto不支持&&判断数组交集,可通过两种等价方式实现逻辑:array_intersect函数:判断两个数组的交集是否非空any_match函数:检查数组中是否存在元素属于目标集合(性能更优)
修正后的完整查询(方式1:array_intersect)
SELECT sub.custID, sum(coalesce(cast(devicecount as INT), 0)) as devicecount, data_attr3 FROM ( SELECT custID, data_attr1 as devicecount, split_part(data_attr3, '-', 2) data_attr3, RANK() OVER ( PARTITION by custID ORDER BY collected_on desc ) AS rownum FROM tableA ) sub WHERE rownum = 1 AND array_intersect(split(data_attr3, ':'), ARRAY['0','1','2','4','5','16']) <> ARRAY[] GROUP BY 1, 3
修正后的完整查询(方式2:any_match,推荐)
SELECT sub.custID, sum(coalesce(cast(devicecount as INT), 0)) as devicecount, data_attr3 FROM ( SELECT custID, data_attr1 as devicecount, split_part(data_attr3, '-', 2) data_attr3, RANK() OVER ( PARTITION by custID ORDER BY collected_on desc ) AS rownum FROM tableA ) sub WHERE rownum = 1 AND any_match(split(data_attr3, ':'), x -> x IN ('0','1','2','4','5','16')) GROUP BY 1, 3
内容的提问来源于stack exchange,提问作者sagar_c_k
相关产品推荐
相关产品推荐

