2014-12-15 2 views
0

Мне нужно очистить поле адреса в PostgreSQL 8.4, удалив все справа от названия улицы. Это включает в себя отбрасывающие сюиты («100 Broadway Street Suite 100») и исправление имен с номерами модулей, добавленными к названию улицы («100 Broadway Street100»), так что результатом в обоих случаях будет «100 Broadway Street».PostgreSQL заменить символы справа от строки

По существу, я пытаюсь удалить все, что находится справа от «Улицы». Кажется, я не могу заставить функцию замены работать без индивидуального кодирования для каждого случая. Функция rtrim также не работает, потому что символы, которые я хочу удалить, будут подстановочными знаками.

Вот что я пытаюсь добраться до работы:

update *tablename* set *fieldname* = replace (*fieldname*, '%STREET%', '%STREET') 

Этот SQL ниже работает, но я не хочу, чтобы закодировать каждую возможную комбинацию:

UPDATE *tablename* set *fieldname* = replace (*fieldname*, ' SUITE 100', ''); 
UPDATE *tablename* set *fieldname* = replace (*fieldname*, ' STREET100', ' STREET'); 

Как я могу удалить все справа от строки «Улица» без явного указания того, что следует за «Улицей»?

Спасибо за помощь.

ответ

1

Попробуйте что-то вроде этого:

SELECT regexp_replace('100 broadway street 100', '(.*)(Street).*', '\1\2', 'i'); 

выше, в основном ищет что-нибудь следуют «Street» (независимо от регистра, за последний «я» agrument), а затем вырезают все после «Улица », о котором я думаю, это то, о чем вы просите. См. http://www.postgresql.org/docs/current/static/functions-matching.html для более подробной информации.

+0

Спасибо за быстрые Ответить. Это работает как ожидалось. – jtodd

0

Это усечение после первого экземпляра «STREET»:

UPDATE tablename 
    SET fieldname = SUBSTR(fieldname, 1, position('STREET' IN fieldname) + 5) 
    WHERE fieldname LIKE '%STREET%' 

Update: Если желание иметь регистронезависимый поиск «STREET»:

UPDATE tablename 
    SET fieldname = SUBSTR(fieldname, 1, position('STREET' IN UPPER(fieldname)) + 5) 
    WHERE UPPER(fieldname) LIKE '%STREET%' 
+0

Обратите внимание, что хотя в примерах OP используется «STREET» (all-caps), он сказал в своем первоначальном описании «Я пытаюсь удалить все, что находится справа от« Street », поэтому я предполагаю, что он действительно хочет без учета регистра Найдите «Улица». –

+0

Спасибо за ответ. Я уже обновил поле, чтобы оно было в верхнем регистре, но оба фрагмента полезны. – jtodd