You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:30:57