Redshift中用REGEXP_SUBSTR查找并替换lname列的逗号
Redshift中用正则函数去除字段中的逗号
首先要明确:REGEXP_SUBSTR 函数的作用是提取符合正则表达式的子串,而非替换内容。如果要实现替换逗号为空的需求,正确的正则函数应该是 REGEXP_REPLACE,它专门用于正则匹配替换,用法和你现有的 replace 类似,但支持更灵活的正则规则。
用REGEXP_REPLACE实现的写法
REGEXP_REPLACE(lname, ',', '') AS lname
这里正则表达式 ',' 匹配所有逗号,替换为空字符串,效果和 replace(lname, ',', '') 完全一致。如果以后需要匹配更复杂的模式(比如多个连续逗号、带空格的逗号等),可以扩展正则规则,比如匹配一个或多个连续逗号:
REGEXP_REPLACE(lname, ',+', '') AS lname
如果非要用REGEXP_SUBSTR实现(不推荐)
因为 REGEXP_SUBSTR 只能提取子串,要去除逗号的话,需要提取所有非逗号的字符并拼接,但Redshift中没有直接的正则拼接函数,步骤繁琐且效率低,示例如下(仅作演示,实际不建议使用):
WITH recursive name_parts AS ( SELECT lname, REGEXP_SUBSTR(lname, '[^,]+', 1, 1) AS part, 1 AS idx FROM your_table UNION ALL SELECT lname, REGEXP_SUBSTR(lname, '[^,]+', 1, idx + 1) AS part, idx + 1 AS idx FROM name_parts WHERE REGEXP_SUBSTR(lname, '[^,]+', 1, idx + 1) IS NOT NULL ) SELECT lname AS original_lname, LISTAGG(part, '') WITHIN GROUP (ORDER BY idx) AS cleaned_lname FROM name_parts GROUP BY lname;
这种方法需要递归提取每个非逗号的片段,再用 LISTAGG 拼接,远不如 replace 或 REGEXP_REPLACE 简洁高效。
总结:如果只是替换单个逗号,replace 已经足够;如果需要复杂正则匹配替换,用 REGEXP_REPLACE;REGEXP_SUBSTR 并不适合做替换操作。
内容的提问来源于stack exchange,提问作者insanity
相关产品推荐
相关产品推荐

