адрес для синтаксического анализа регулярных выражений, чтобы не включать apt или suite в конце

#oracle #regexp-substr

#Oracle #регулярное выражение-substr

Вопрос:

У меня есть множество адресов, которые мне нужно сопоставить друг с другом (мать / дети), Некоторые адреса имеют apt, suite и т. Д. И т. Д. В конце строки — Пытался найти способы получить всю строку без этой последней части-

 with addy as (select '22 W JAMESTOWN ST APT 22' as addy from dual union 
              select '22 W JAMESTOWN ST 22' as addy from dual)
select addy.*,regexp_substr(addy,'(d*)(D*)(s)',1,1,'i') as no_ from addy;
  

Конечный результат должен быть: 22 W JAMESTOWN ST
Это в oracle — функция look ahead, похоже, не работает —
‘/. ?(?= APT)/’ не имеет никакого эффекта

Первая строка работает, вторая — нет. Приветствуется любой ввод — ТИА Лоуренс

Ответ №1:

Вместо REGEX_SUBSTR этого вы можете попытаться REGEX_REPLACE удалить дополнительную информацию из конца адреса.

Запрос

 WITH
    addy
    AS
        (SELECT '22 W JAMESTOWN ST APT 22' AS addy FROM DUAL
         UNION
         SELECT '22 W JAMESTOWN ST 22' AS addy FROM DUAL)
SELECT addy.*, REGEXP_REPLACE (addy, 's?(APT)?s?d $') AS no_
  FROM addy;
  

Результат

                        ADDY                  NO_
___________________________ ____________________
22 W JAMESTOWN ST 22        22 W JAMESTOWN ST
22 W JAMESTOWN ST APT 22    22 W JAMESTOWN ST
  

Комментарии:

1. Спасибо. Это работает. Быстрый вопрос — как мне сделать это нечувствительным к регистру?

2. Просто оберните UPPER примерно addy REGEXP_REPLACE так: REGEXP_REPLACE (upper(addy), 's?(APT)?s?d $')

3. Для полноты REGEXP_REPLACE имеет параметр без учета регистра, но он требует ввода всех аргументов: REGEXP_REPLACE (addy, 's?(APT)?s?d $', NULL, 1, 1, 'i')