如何替换数组中的值

时间:2014-11-18 05:21:46

标签: 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

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

4 个答案:

答案 0 :(得分:2)

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

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

作为commented by @muarray_replace()引入了第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。将补丁应用于源并重新编译

从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;