我有如下数据。
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/