Postgresql

如何在 PostgreSQL 9.2 中使用整數的 CSV 從 col 中刪除元素?

  • July 5, 2017

我有 PostgreSQL 9.2 數據庫和一個表:

id integer,
allowed_types character varying(255)`

樣本數據如下:

id  allowed_types
1   3,4,5,13,14

如何從逗號分隔的 varchar 列表中刪除45 ?allowed_types

刪除後,結果應該是allowed_types = 3,13,14

該表上有許多記錄,每條記錄allowed_types可以包含不同的數字,用逗號分隔。

我考慮過string_to_array()and array_remove(),但array_remove()還沒有在 9.2 版中。

正則表達式的概念證明:

SELECT trim(regexp_replace(',' || '3,4,5,13,14' || ',', ',(4|5)(?=,)', '', 'g'), ',');

回報:

3,13,14

填充逗號以覆蓋開始和結束的角落案例。正則表達式',(4|5)(?=,)'解釋:

,… 文字逗號

(4|5)… 兩個分支:4 或 5

(?=,)正向前瞻:下一個字元是文字​​逗號

需要一個功能性三元組索引(',' || allowed_types || ',')才能在大表中獲得良好的性能(由於添加了逗號,僅比正常索引略大)。細節:

或者,使用更複雜的正則表達式,您可以使用原始列和三元組索引(allowed_types)

SELECT ltrim(regexp_replace('3,4,5,13,14', '((,|^)(4|5))(?=,|$)', '', 'g'), ',');

dbfiddle在這裡

但我希望第一個解決方案更快:複雜的正則表達式更昂貴。

根據UPDATE

UPDATE tbl
SET    allowed_types = trim(regexp_replace(',' || allowed_types || ',', ',(4|5)(?=,)', '', 'g'), ',')
WHERE  ',' || allowed_types || ',' ~ ',(4|5),';  -- here, plain comma is good

我真正要做的:

更新到 Postgres 的目前版本(第 9.2 頁達到 EOL 2017 年 9 月)並且可能使用標準化的 1:n 設計。

引用自:https://dba.stackexchange.com/questions/177962