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)
谁能建议如何使用它?
您的陈述(用缺少的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 个选项:
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)
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 值。有关的:
如果您需要保证元素的顺序:
从 git repo 中获取补丁“添加 array_remove() 和 array_replace() 函数”,将其应用到您的版本源并重新编译。可能会或可能不会干净地应用。您的版本越旧,您的机会就越差。我还没有尝试过,我宁愿升级到当前版本。