正则表达式替换SQL

时间:2019-03-28 16:09:59

标签: regex postgresql

我必须用空字符串替换SQL中的字符串模式,有人可以建议我吗?

输入字符串'AC001,AD001,AE001,SA001,AE002,SD001'
输出字符串'AE001,AE002

有4位数字代码,前2个字符为“字母”,后两位为数字。这始终是4位代码。而且我必须替换所有以“ AE”开头的代码以外的代码。

我在字符串中可以有0个或更多“ AE”代码实例。最终输出应为上述多个“ AE”代码的格式字符串“用逗号分隔”。

2 个答案:

答案 0 :(得分:0)

这是一个多次调用regex_replace的选项,在每次迭代中一点一点地消除了“不需要”字符串,以达到所需的输出。

SELECT regexp_replace(
            regexp_replace(
                regexp_replace(
                    'AC001,AD001,AE001,SA001,AE002,SD001', '(?<!AE)\d{3},{0,1}', 'X','g'
                ),'..X','','g'
            ),',$','','g'
        )

请参见演示here

答案 1 :(得分:0)

我会将列表转换为数组,然后将其嵌套为行,然后过滤掉应保留的行并将其聚合回字符串:

select string_agg(t, ',')
from unnest(string_to_array('AC001,AD001,AE001,SA001,AE002,SD001',',') as x(t)
where x.t like 'AE%'; --<< only keep those

这与字符串中元素的数量无关,可以轻松扩展以支持更复杂的条件。


这是一个很好的示例,为什么一开始将逗号分隔的值存储在一个单独的列中并不是一个好主意。