arrays - 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]);
如何创建这样的功能?
解决方案
听起来您想要的是数组上的 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'))))
(我确信有一种方法可以通过位置索引和创建函数等来做到这一点,但这是我的快速解决方案)。