arrays - 如何替换数组中的值

标签 arrays postgresql postgresql-9.2

我有如下数据。

id              col1[]
---             ------
1                {1,2,3}
2                {3,4,5}

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

select array_replace(col1, 1, 100) where id = 1;

但它给出了如下错误:

function array_replace(integer[], integer, integer) does not exist

有人可以建议如何使用它吗?

最佳答案

您的声明(使用缺少的 FROM 子句进行了扩充):

SELECT array_replace(col1, 1, 100) FROM tbl WHERE id = 1;

作为commented by @mu , array_replace()是在 pg 9.3 中引入的。我看到旧版本的 3 个选项:

1。 intarray

只要……

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

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

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

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)';

不替换 NULL 值。相关:

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

3。对源应用补丁并重新编译

获取补丁 "Add array_remove() and array_replace() functions"从 git repo,将它应用到你的版本源并重新编译。可能会或可能不会干净地应用。您的版本越旧,您的机会就越少。我还没有尝试过,我宁愿升级到当前版本。

关于arrays - 如何替换数组中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26987139/

相关文章:

带有时间刻度升级的 postgresql

sql - 如何查找给定列是否存在唯一键约束

c++ - 从 c++/c 中的函数返回的问题

Java:迭代多维数组概念

javascript - 如何按 2 个不同的属性进行过滤?

sql - 按编号(索引)引用列

postgresql - 确定真空后的自由空间

php - 为什么我的 MySQL 查询返回多维数组而不是一维数组?

postgresql - 无法在容器之间建立连接

postgresql - postgres 中相对于其他行的部分唯一索引