замена регулярного выражения для SQL

#regex #postgresql

#регулярное выражение #postgresql

Вопрос:

Мне нужно заменить шаблон строки в SQL на пустую строку, кто-нибудь может мне подсказать?

Строка ввода 'AC001,AD001,AE001,SA001,AE002,SD001'
Выходная строка 'AE001,AE002

Существуют 4-значные коды с первыми 2 символами «алфавитов», а последние два являются цифрами. Это всегда 4-значный код. И я должен заменить все коды, кроме кодов, начинающихся с «AE».

У меня может быть 0 или более экземпляров кодов «AE» в строке. Конечным результатом должна быть форматированная строка, «разделенная запятыми» для нескольких кодов «AE», как упоминалось выше.

Комментарии:

1. Вы просматривали страницу руководства Postgres по регулярным выражениям ? Оно включает в себя regexp_replace функцию.

Ответ №1:

Вот один из вариантов, вызывающий regex_replace несколько раз, постепенно удаляя «необязательные» строки на каждой итерации, чтобы получить требуемый результат.

 SELECT regexp_replace(
            regexp_replace(
                regexp_replace(
                    'AC001,AD001,AE001,SA001,AE002,SD001', '(?<!AE)d{3},{0,1}', 'X','g'
                ),'..X','','g'
            ),',$','','g'
        )
  

Смотрите демонстрацию здесь

Комментарии:

1. Большое спасибо, vmaroli, ваше решение действительно сработало. Я не понял использование «{0,1} в коде. Не могли бы вы, пожалуйста, объяснить?

2. {0,1} используется для сопоставления нуля или одного символа coma.

Ответ №2:

Я бы преобразовал список в массив, переназначил его в строки, затем отфильтровал те, которые следует сохранить, и объединил их обратно в строку:

 select string_agg(t, ',')
from unnest(string_to_array('AC001,AD001,AE001,SA001,AE002,SD001',',') as x(t)
where x.t like 'AE%'; --<< only keep those
  

Это не зависит от количества элементов в строке и может быть легко расширено для поддержки более сложных условий.


Это хороший пример того, почему хранение значений, разделенных запятыми, в одном столбце не является такой уж хорошей идеей для начала.