Вы можете выполнить это требование, используя 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