#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')