#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
Это не зависит от количества элементов в строке и может быть легко расширено для поддержки более сложных условий.
Это хороший пример того, почему хранение значений, разделенных запятыми, в одном столбце не является такой уж хорошей идеей для начала.