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

Teradata中REGEXP_REPLACE批量替换多子串的正确方法

解决Teradata中REGEXP_REPLACE多完整子串替换的问题

我完全懂你的需求——想要一次性匹配并替换掉多个完整的目标子串(比如Inj、Unit、ML)和数字,再清理掉多余空格,得到干净的药品名称。你之前踩的坑我也遇到过:用了方括号[]的字符类写法,它只会匹配括号里的单个字符,所以才会把INJ拆成I、N、J分别替换,完全达不到匹配整个单词的效果。

正确的实现方式

Teradata的REGEXP_REPLACE支持用**竖线|**来分隔多个匹配模式(表示“或”的逻辑),再配合单词边界\b确保匹配完整单词,就能实现你要的多子串批量替换。结合OREPLACE清理连续空格,完整SQL如下:

SELECT 
    OREPLACE(
        REGEXP_REPLACE(
            UPPER(TRIM(DWI.GPI_Generic_Name)),
            -- 匹配目标完整单词 + 数字,忽略大小写
            '(\b(INJ|UNIT|ML)\b|\d+)',
            ' ',
            1, 0, 'i'
        ),
        -- 把多个连续空格压缩成单个
        '  ', ' ', 1, 0
    ) AS Cleaned_Generic_Name
FROM your_table DWI;

关键部分解释

  • \b(INJ|UNIT|ML)\b:\b是单词边界,确保我们匹配的是完整的独立单词(比如不会误匹配包含"ML"的"MLabc");竖线|分隔所有需要替换的目标子串,后续要加新的子串直接在括号里用|追加即可(比如INJ|UNIT|ML|MG)。
  • \d+:匹配一个或多个连续数字(比如你的例子里的100)。
  • 'i'参数:开启忽略大小写模式,不管原字符串里是Inj、INJ还是inj都会被匹配替换。
  • 外层OREPLACE:替换后可能产生多个连续空格,用它把多个空格压缩成单个,保证输出格式整洁。

适配你的示例需求

对于输入字符串"Insulin Aspart Inj 100 Unit/ML",如果想要彻底去掉斜杠这类符号,把正则调整为'(\b(INJ|UNIT|ML)\b|\d+|/)',就能同时替换掉斜杠,最终得到你想要的"INSULIN ASPART"(如果需要小写格式,可以在外层再加LOWER()函数)。

内容的提问来源于stack exchange,提问作者JMichael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:26:26