AWS Redshift使用LEFT函数做JOIN时报invalid operation错误如何解决
问题根因
你当前报错的核心原因是LEFT()函数的参数使用不符合Redshift语法要求:left(c.segmentation_name::text, '-4'::integer)中第二个参数传入了负整数,而Redshift的LEFT函数要求第二个参数为非负整数,代表从字符串左侧开始截取的字符长度,负数参数会直接触发invalid operation错误。
你去掉LEFT函数后关联逻辑没有非法参数,所以可以正常运行。
解决方案
根据你的实际业务需求二选一即可:
- 若需求是截取
c.segmentation_name的最后4位做匹配,直接改用RIGHT()函数,传入正整数4作为参数:
select id from state LEFT JOIN city c ON lower(right(c.segmentation_name::text, 4)) = lower(state.name::text)
- 若需求是截取
c.segmentation_name去掉末尾4位的前半部分做匹配,先通过字符串长度计算合法的截取长度,同时用greatest()函数避免字符串总长度不足4时出现负数参数:
select id from state LEFT JOIN city c ON lower(left(c.segmentation_name::text, greatest(length(c.segmentation_name::text) - 4, 0))) = lower(state.name::text)
验证建议
修改前可以先单独执行函数逻辑验证返回结果符合预期,再放到JOIN关联条件中,比如:
-- 测试截取逻辑是否正确 select segmentation_name, left(segmentation_name::text, greatest(length(segmentation_name::text) -4, 0)) from city limit 10;
内容的提问来源于stack exchange,提问作者curiosityrock
相关产品推荐
相关产品推荐

