首页 > 解决方案 > Postgres array_replace() 函数替换子数组

问题描述

array_replace(anyarray, anyelement, anyelement)当您需要替换数组中的一个元素时,postgres 函数很有用。

但是我需要用另一个序列替换数组中的一系列元素。我希望能够拥有这样的功能:array_replace(anyarray, anyarray, anyarray)

例如。如果我有这个数组:[A, B, C, D, E, F]

我想把它改成[A, 1, 2, 3, D, E, F]

通过调用这样的函数:array_replace([A, B, C, D, E, F], [B, C], [1, 2, 3]);

要替换的元素都应该按照传递给函数的确切顺序,一个接一个。因此,以下调用不会更改原始数组,因为 B 和 C 不在原始数组的元素附近:

array_replace([A, B, X, C, D, E, F], [B, C], [1, 2, 3]);

如何创建这样的功能?

标签: arrayspostgresqlreplace

解决方案


听起来您想要的是数组上的 regexp_replace 。Postgres 允许将数组转换为字符串(反之亦然)。然而,诀窍是将每个数组元素视为一个单词,并在单词边界的等效项上进行匹配。

以下代码返回{A,1,2,3,D,E,F}

Select array(
    select regexp_replace(
          (select array_to_string(array['A','B','C','D','E','F'],', ')),
          (select ' ' || array_to_string(array['B','C']),', ')),
          (select array_to_string(array[1,2,3],',')),
          'g'))))

(我确信有一种方法可以通过位置索引和创建函数等来做到这一点,但这是我的快速解决方案)。


推荐阅读