Прежде всего, вам не нужно удваивать обратную косую черту, если не включено standard_conforming_strings
:
standard_conforming_strings (boolean)
Это контролирует, обрабатывают ли обычные строковые литералы ('...') обратную косую черту буквально, как указано в стандарте SQL. Начиная с PostgreSQL 9.1, по умолчанию включено (предыдущие версии по умолчанию выключены). Приложения могут проверить этот параметр, чтобы определить, как будут обрабатываться строковые литералы. Наличие этого параметра также может рассматриваться как указание на то, что синтаксис escape-строки (E '...') поддерживается. Синтаксис Escape-строки ( Раздел 4.1.2.2 ) следует использовать, если приложение хочет, чтобы обратные слеши обрабатывались как escape-символы.
Далее необходимо использовать глобальный модификатор g
для замены всех совпадений, см. 9.7. Сопоставление с образцом сечение :
Флаг i
задает сопоставление без учета регистра, а флаг g
указывает замену каждой совпадающей подстроки, а не только первой.
Используйте
SELECT regexp_replace('09,09,41,41,42,42,49,49,49,49,200,200,400,400,500,500', '(?<=,|^)([^,]*)(,\1)+(?=,|$)', '\1', 'g') AS lignes
![enter image description here](https://i.stack.imgur.com/4WvT1.png)
См. Онлайн-демонстрацию .
Если вы хотите сделать шаблон более эффективным, используйте двойное отрицание:
'(?<![^,])([^,]*)(,\1)+(?![^,])'