Vertica中使用Trim函数更新字符串报括号位置语法错误如何解决
错误原因
这个语法错误和括号配对无关,核心是UPDATE语句的SET子句写法不符合SQL语法规则:SET后只能直接填写需要更新的表原生列名作为赋值目标,不支持把split_part()这类函数的返回值放在等号左侧被赋值。数据库解析到split_part后的左括号时,发现该位置不符合语法预期(本该出现列名),才会抛出"("位置的语法错误。
修正后的SQL
你需要的效果是对client_info按:分割后的第9段做去空格处理,其余分段保持不变,再把完整字符串更新回原列,正确写法(适用于PostgreSQL、Redshift、Greenplum等支持split_part的数据库)如下:
UPDATE table1 SET client_info = ( SELECT string_agg( CASE WHEN rn = 9 THEN Trim(part) ELSE part END, ':' ORDER BY rn ) FROM unnest(string_to_array(client_info, ':')) WITH ORDINALITY AS parts(part, rn) ) WHERE lm_id = 122344556 AND record_id = 11111;
写法说明
- 逻辑是先把
client_info按:拆分为带序号的分段,遍历分段时仅对第9段执行Trim()去前后空格,其余分段保留原值,最后按原顺序用:拼接回完整字符串,不会丢失任何分段内容 - 如果你确认
client_info固定只有9个分段,也可以用简化拼接写法,但不推荐生产环境使用,一旦后续字段分段数增加会丢失数据:
-- 仅适用于client_info固定9段的场景,不推荐生产环境使用 UPDATE table1 SET client_info = concat_ws( ':', split_part(client_info,':',1), split_part(client_info,':',2), split_part(client_info,':',3), split_part(client_info,':',4), split_part(client_info,':',5), split_part(client_info,':',6), split_part(client_info,':',7), split_part(client_info,':',8), Trim(split_part(client_info,':',9)) ) WHERE lm_id=122344556 AND record_id=11111;
内容的提问来源于stack exchange,提问作者Riya
相关产品推荐
相关产品推荐

