2016-03-05 79 views
3

我正尝试使用正则表达式更新数组列中每个元素中某个值的所有匹配项。在postgres的数组列中使用regexp_replace

如果列是text[]和文本类型的而不是替代我会用这个查询更新:

UPDATE my_table 
SET my_column = regexp_replace(
    my_column, 'foo(\d+)', 'bar\1', 'g' 
) 

我怎样才能在一个阵列替换列的每个元素?

回答

4

,因为我知道最简单的方法:

UPDATE my_table SET 
    my_column = array(
    SELECT regexp_replace(unnest(my_column), 'foo(\d+)', 'bar\1', 'g')) 

PostgreSQL的太聪明。可以使用SRF(设置返回函数,只是谷歌它)作为其他函数的参数。例如:

select abs(unnest('{1,-2,3}'::int[])); 

是相同的,以

select abs(x) from unnest('{1,-2,3}'::int[]) as x; 

但较短。

其返回

 
┌─────┐ 
│ abs │ 
╞═════╡ 
│ 1 │ 
│ 2 │ 
│ 3 │ 
└─────┘ 

而且array(select ...)只是数组构造函数变换select...结果为数组。

0

使用CTE到unnest()该数组,对数组元素进行转换并聚合回数组,然后将其用于UPDATE。假设你的表有一个主键:

WITH changed(key, arr) AS (
    SELECT id, array_agg(regexp_replace(col, 'foo(\d+)', 'bar\1', 'g')) 
    FROM my_table, unnest(my_column) un(col) 
    GROUP BY id 
) 
UPDATE my_table 
SET my_column = arr 
FROM changed 
WHERE id = key