замена регулярного выражения для SQL - PullRequest
0 голосов
/ 28 марта 2019

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

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

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

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


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

0 голосов
/ 28 марта 2019

Вот один из вариантов, вызывающий 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'
        )

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...