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
相关产品推荐
相关产品推荐

