如何替换数组中的值

use*_*872 4 arrays postgresql postgresql-9.2

我有如下数据。

id              col1[]
---             ------
1                {1,2,3}
2                {3,4,5}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在数组中使用替换函数。

select array_replace(col1, 1, 100) where id = 1;
Run Code Online (Sandbox Code Playgroud)

但它给出了一个错误,如:

function array_replace(integer[], integer, integer) does not exist
Run Code Online (Sandbox Code Playgroud)

谁能建议如何使用它?

Erw*_*ter 5

您的陈述(用缺少的FROM子句补充):

SELECT array_replace(col1, 1, 100) FROM tbl WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

正如@mu评论的array_replace()是在pg 9.3中引入的。我看到旧版本的3 个选项

1. intarray

只要 ...

  • 我们正在处理整数数组
  • 元素是独一无二的。
  • 并且元素的顺序无关紧要。

一个简单而快速的选择是安装附加模块intarray,它(除其他外)提供运算符来从/向整数数组减去和添加元素(或整个数组):

SELECT CASE col1 && '{1}'::int[] THEN (col1 - 1) +  100 ELSE col1 END AS col1
FROM   tbl WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

2. 用 SQL 函数模拟

array_replace()使用多态类型的(较慢的)替代品,因此它适用于任何基本类型:

CREATE OR REPLACE FUNCTION f_array_replace(anyarray, anyelement, anyelement)
  RETURNS anyarray LANGUAGE SQL IMMUTABLE AS
'SELECT ARRAY (SELECT CASE WHEN x = $2 THEN $3 ELSE x END FROM unnest($1) x)';
Run Code Online (Sandbox Code Playgroud)

不替换 NULL 值。有关的:

如果您需要保证元素的顺序:

3. 对源码打补丁,重新编译

从 git repo 中获取补丁“添加 array_remove() 和 array_replace() 函数”,将其应用到您的版本源并重新编译。可能会或可能不会干净地应用。您的版本越旧,您的机会就越差。我还没有尝试过,我宁愿升级到当前版本。