PostgreSQL регулярное выражение заменяет функцию условием - PullRequest
0 голосов
/ 10 февраля 2020

Есть таблица PostgreSQL. Эта таблица имеет поле, которое содержит запросы хранимых процедур в виде строки. Я ищу решение для замены регулярных выражений, с помощью которого я могу удалить часть строки, но только в тех случаях, когда строка содержит 'tmp'.

Пример ввода строки:

...from schema1.table_1...
...from schema1.table_1_tmp...
...from schema1.table_2...
...from schema1.table_2_tmp...

Цель:

...from schema1.table_1...
...from table_1_tmp...
...from schema1.table_2...
...from table_2_tmp...

schema1 - это статическое значение c, отличаются только имена таблиц. Некоторые из них содержат подстроку tmp, некоторые нет.

Если она содержит tmp, мы должны удалить строку schema1.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Вам действительно нужно обновить Postgres версию; версия 8.3.x вышла из строя в феврале 2013 года. Тем не менее, ответ @GMB должен работать, так как все соответствующие функции регулярного выражения существуют в нем. Однако вы также можете попробовать функцию замены.

with test_tab (tbl) as
     ( values ('...from schema1.table_1...')
            , ('...from schema1.table_1_tmp...')
            , ('...from schema1.table_2...')
            , ('...from schema1.table_2_tmp...')
     )
 select replace(tbl,'schema1.','') "Without Schema"
   from test_tab
  where tbl ilike '%schema1%_tmp%';
0 голосов
/ 10 февраля 2020

Вы можете использовать regexp_replace() следующим образом:

regexp_replace(mycol, '\sschema1\.(\w+_tmp)\s', ' \1 ')

Распределение регулярных выражений:

\s           a space
schema1\.    litteral string "schema1."
(            beginning of a capturing group
    \w+          at many alphanumeric characters as possible (including "_")
    _tmp         litteral string "_tmp"
)            end of the capturing group
\s           a space

Когда строка соответствует регулярному выражению, соответствующее выражение заменяется на: пробел, затем захваченная часть, затем другой пробел.

Демонстрация на DB Fiddle :

with t as (
    select '... from schema1.table_1_tmp ...' mycol
    union all select '... from schema1.table_2 ...'
)
select mycol, regexp_replace(mycol, '\sschema1\.(\w+_tmp)\s', ' \1 ') newcol from t
mycol                            | newcol                      
:------------------------------- | :---------------------------
... from schema1.table_1_tmp ... | ... from table_1_tmp ...    
... from schema1.table_2 ...     | ... from schema1.table_2 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...