我有如下数据。
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
任何人都可以建议如何使用它吗?
答案 0 :(得分:2)
您的陈述(使用缺少的FROM
子句进行了扩充):
SELECT array_replace(col1, 1, 100) FROM tbl WHERE id = 1;
作为commented by @mu,array_replace()
引入了第9.3页。我看到旧版本的 3个选项:
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;
使用多态类型对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值。相关:
如果您需要保证元素的顺序:
从git repo获取补丁"Add array_remove() and array_replace() functions",将其应用于您的版本的源并重新编译。可能会或可能不会干净利落。你的版本越老,你的机会越差。我没有尝试过,我宁愿升级到当前版本。
答案 1 :(得分:0)
您可以创建自己的 基于此source:
CREATE TABLE arr(id int, col1 int[]);
INSERT INTO arr VALUES (1, '{1,2,3}');
INSERT INTO arr VALUES (2, '{3,4,5}');
SELECT array(
SELECT CASE WHEN q = 1 THEN 100 ELSE q END
FROM UNNEST(col1::int[]) q)
FROM arr;
array
-----------
{100,2,3}
{3,4,5}
您可以创建自己的函数并将其放在public
架构中,如果您仍希望通过函数进行调用,尽管它与原始函数略有不同。
答案 2 :(得分:0)
UPDATE tbl SET col1 = array_replace(col1, 1, 100) WHERE id = 1;
答案 3 :(得分:0)
以下是测试数组的示例查询:
SELECT test_id,
test_array,
(array (
-- Replace existing value 'int' of an array with given value 'Text'
SELECT CASE WHEN a = '0' THEN 'MyEntry'
WHEN a = '1' THEN 'Apple'
WHEN a = '2' THEN 'Banana'
WHEN a = '3' THEN 'ChErRiEs'
WHEN a = '4' THEN 'Dragon Fruit'
WHEN a = '5' THEN 'Eat a Fruit in a Day'
ELSE 'NONE' END
FROM UNNEST(test_array::TEXT[]) a) ::TEXT
-- UNNEST : Lists out values of my_test_array
) test_result
FROM (
--my_test_array
SELECT 1 test_id, '{0,1,2,3,4,5,6,7,8,9}'::TEXT[][] test_array
) test;