Postgresql
如何在 PostgreSQL 9.2 中使用整數的 CSV 從 col 中刪除元素?
我有 PostgreSQL 9.2 數據庫和一個表:
id integer, allowed_types character varying(255)`
樣本數據如下:
id allowed_types 1 3,4,5,13,14
如何從逗號分隔的 varchar 列表中刪除4和5 ?
allowed_types
刪除後,結果應該是
allowed_types = 3,13,14
。該表上有許多記錄,每條記錄
allowed_types
可以包含不同的數字,用逗號分隔。我考慮過
string_to_array()
andarray_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 設計。