Postgres: REGEXP_REPLACE с использованием нескольких столбцов - PullRequest
1 голос
/ 29 апреля 2020

У меня есть такая таблица:

Address                      | Remove1 | Remove2 | Remove3
-------------------------------------------------------------
100 Street, City, State Zip  | Street  |  City   | State

Я хочу вывод, подобный этому:

Address                      | Remove1 | Remove2 | Remove3 | OutputCol
------------------------------------------------------------------------------
100 Street, City, State Zip  | Street  |  City   | State   | 100 *, *, * Zip

В основном я хочу заменить текст в сопоставлении столбца адреса на нескольких столбцах удаления на '*'

Я пытался использовать функции REGEXP_REPLACE и REPLACE, но обе они дают частичные результаты. Есть ли способ, которым я могу использовать REGEXP_REPLACE(Address, (Remove1|Remove2|Remove3) , '*', 'g')?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2020

Я думаю, что вы довольно близко. Вам просто нужно правильно объединить значения столбцов, например:

regexp_replace(
    address,
    concat_ws('|', remove1, remove2, remove3),
    '*',
    'g'
)

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

select  
    t.*,
    regexp_replace(address, concat_ws('|', remove1, remove2, remove3), '*', 'g') OuputCol 
from mytable t
address                     | remove1 | remove2 | remove3 | ouputcol       
:-------------------------- | :------ | :------ | :------ | :--------------
100 Street, City, State Zip | Street  | City    | State   | 100 *, *, * Zip
1 голос
/ 29 апреля 2020

Это то же самое, что вы сделали. Вам просто нужно объединить строки

with wt as 
(
   select '100 Street, City, State Zip' address, 
     'Street' Remove1, 'City' Remove2, 'State' Remove3
)
select REGEXP_REPLACE(address, '(' || Remove1 || '|' || Remove2 ||'|'||Remove3 ||')' , '*', 'g') from wt

Демо

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