2016-05-13 3 views
0

У меня есть запрос (sql), чтобы вытащить название улицы из строки. Он ищет последнее вхождение цифры, а затем вытягивает исходящий текст в качестве названия улицы. Я получаю оракулАргумент '0' находится за пределами допустимой погрешности

«аргумент„0“вне диапазона»

ошибку, но я изо всех сил, чтобы выяснить, как это исправить.

часть запроса в вопросе

substr(address,regexp_instr(address,'[[:digit:]]',1,regexp_count(address,'[[:digit:]]'))+2) 

любая помощь будет удивительно. (С использованием SQL Developer)

+0

Может быть, вы обращаетесь не имеют цифр, так счетчик дает 0; можете ли вы отправить пример начальной строки и желаемого вывода? – Aleksej

+0

это было именно оно. когда я добавил предложение, чтобы убедиться, что в строке есть цифры, ошибка исчезла. большое спасибо! – Jenny

ответ

1

Четвертый параметр regexp_instr является возникновение:

случае, представляет собой положительное целое число, указывающее, какой появление узор в исходная_строка Oracle следует искать. По умолчанию используется значение 1, , что означает, что Oracle ищет первое вхождение шаблона.

В этом случае, если адрес не имеет цифр внутри, regexp_count вернет 0, это не является допустимым вхождением.

0

Более простое решение, которое не требует отдельного рассмотрения для адресов без номера дома, это:

with t (address) as (
     select '422 Hickory Str.' from dual union all 
     select 'One US Bank Plaza' from dual 
    ) 
select regexp_substr(address, '\s*([^0-9]*)$', 1, 1, null, 1) as street from t; 

Результат выглядит следующим образом:

STREET 
------------------------- 
Hickory Str. 
One US Bank Plaza 

Третий аргумент REGEXP_SUBSTR является первый из трех. Это означает начало поиска по первому символу адреса. Второй 1 означает поиск первого появления шаблона поиска. Нуль означает отсутствие специальных модификаторов соответствия (например, нечувствительность к регистру - ничего подобного здесь не требуется). Последний 1 означает «вернуть первую SUBEXPRESSION из шаблона соответствия». Подвыражения являются частями выражения соответствия, заключенного в круглые скобки.

Шаблон соответствия имеет значение $ в конце - значение «якорь в конце строки ввода» ($ означает конец строки). Затем [...] означает соответствие любому из символов в квадратных скобках, но^в [^ ...] меняет его, чтобы он соответствовал любому символу OTHER, чем то, что находится в квадратных скобках. 0-9 означает все символы от 0 до 9; поэтому [^ 0-9] означает соответствие любому символу (-ам) ДРУГИЕ ЧЕМ цифры, а * после этого означает «любое количество таких символов» (от 0 до всего в строке ввода). \ s - это «пустое место» - если в адресе есть пробелы, следующие за возможным номером, вы не хотите, чтобы они включались в начале названия улицы. Подвыражение просто [^ 0-9] * означает нецифровые числа, не считая пробелов перед ними (поскольку \ s * находится за левой скобкой).

Мой пример иллюстрирует потенциальную проблему, хотя - иногда на самом деле адрес имеет в себе «число», но вместо него используется слово вместо использования цифр. То, что я показываю, на самом деле является реальным адресом в моем городе.

Удачи вам!

0

ищет последнее вхождение цифры, а затем вытягивать текст продолжающегося в качестве названия улицы

Вы могли бы просто сделать:

SELECT REGEXP_REPLACE(address, '^(.*)\d+\D*$', '\1') 
     AS street_name 
FROM address_table; 
Смежные вопросы