Сопоставьте первый адрес с помощью регулярных выражений - PullRequest
1 голос
/ 01 апреля 2019

У меня довольно грязные данные адресов клиентов.Для каждого клиента есть 2 или более адресов в одной строке.Используя регулярные выражения в Oracle, я хочу вычесть первое.

Было бы очень легко, если бы был тот же разделитель, что и ';'.Но иногда бывает запятая.И запятая также используется в адресе для разделения города, улицы и здания.

У меня есть русские адреса, поэтому я перевел их для вас.

Например, у меня есть строка с несколькими адресами:

enter image description here

Запятая является разделителем, но она также разделяет блоки внутри адресов.
Таким образом, я мог бы сопоставить первый адрес, сопоставляя все до второго '\sul\.'.

Но я не знаю, как это сделать.Regexp_substr(address, '.*,\sul') вернет

enter image description here

Это далеко не то, что мне нужно.

Так, как я могу вычесть все, пока не вернется секунда ,\sul\.?

Russia, Moscow, ul. Tverskaya, d.32.

1 Ответ

1 голос
/ 01 апреля 2019

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

SUBSTR(v, 1, INSTR(v, ', ul.', 1, 2) - 1)

INSTR() находит позицию второго вхождения строки ', ul.' в исходной строке, а SUBSTR() выбирает все от начала строки до этой позиции (минус 1).

Пример:

WITH t AS (
    SELECT 'Russia, Moscow, ul. Tverskaya, d.32, ul. Yakimanka, d21, ul. Kalinina, d.43' address FROM DUAL
)
SELECT SUBSTR(address, 1, INSTR(address, ', ul.', 1, 2) - 1) adress1 FROM t
| ADRESS1                             |
| :---------------------------------- |
| Russia, Moscow, ul. Tverskaya, d.32 |

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


NB: это работает до тех пор, пока в строке действительно есть хотя бы два вхождения данного шаблона. Если у вас есть значения, которые не соответствуют этой спецификации и которые вы хотите сохранить, вам потребуется дополнительный уровень тестирования, например:

CASE INSTR(address, ', ul.', 1, 2)
    WHEN 0 THEN address
    ELSE SUBSTR(address, 1, INSTR(address, ', ul.', 1, 2) - 1) 
END adress1 

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

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