2016-03-05 81 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