Вот регулярное выражение, которое получит последние 2 набора символов из вашей строки. Поскольку кажется, что вы получаете канадский почтовый индекс, вы можете быть немного осторожнее.
Предложение WITH устанавливает таблицу с данными. Обратите внимание, что первая строка является допустимым форматом почтового индекса, но вторая строка имеет неверный формат (2 буквы подряд). Всегда используйте неожиданные данные для своих тестовых случаев, вы не хотите никаких сюрпризов, и данные всегда БУДУТ содержать сюрпризы.
Первое регулярное выражение соответствует 2 наборам из 3 символов, разделенных пробелом в конце строки. На первый взгляд это может показаться нормальным, но если данные плохие, они будут возвращены. Чтобы ужесточить его, используйте второе регулярное выражение, которое специально проверяет формат канадского почтового индекса uppercase_letter-digit-uppercase_letter-space-digit-uppercase_letter-digit и возвращает NULL, если он не найден. Возможно, вы захотите поймать это с помощью вызова NVL() и вместо этого вернуть сообщение.
with tbl(str) as (
select 'Windsor ON P6B 0B8' from dual union all
select 'Windsor_bad_postcode ON A3C 9BB' from dual
)
select --regexp_substr(str, '.* (.{3} .{3})$', 1, 1, NULL, 1) postcode_w_bad
regexp_substr(str, '.* ([A-Z]\d[A-Z] \d[A-Z]\d)$', 1, 1, NULL, 1) postcode
from tbl;
person
Gary_W
schedule
01.12.2017