2015-07-15 4 views
0

У меня есть база данных оракула и фильтр по регулярному выражению, чтобы найти записи с именами, начинающимися с владения в определенном диапазоне. Например, чтобы найти все имена, начинающиеся с A, B или C, я просто использовать:regex для строки начинается с символов в диапазоне

.. WHERE REGEXP_LIKE (last_name, '^[A-C]'); 

, но я ищу решение для фильтрации на что-то подобное. Найдите имена всех, начиная с «Ab» - «Ch». У кого-то есть идея, как это сделать?

спасибо. Phill

EDIT: Я забыл сказать, что я из Германии, и мне также необходимо поддерживать специальные персонажи. Oracle regex обладает особой способностью использовать все варианты букв. Например, [= A =] означает все вариации A, такие как a, ä, Ä и т. Д.

Решение chocochaos дало мне хороший намек, чтобы решить мою проблему. Для примера, если я хочу, чтобы найти все имена, начинающиеся с «Ne», пока все имена, начинающиеся с «Ot» (включая специальные символы) Я не могу использовать

WHERE REGEXP_LIKE (last_name, '^(([=A=][[=N=]-[=Z=]])|([=B=][[=A=]-[=E=]]))'); 

EDIT2: другое хорошее решение я узнал, нормализуется все имена-строки для значений, которые больше не содержат специальных символов. Для меня результат один и тот же, но его определенно быстрее:

LOWER(convert(last_name, 'US7ASCII')) >= LOWER('An') AND SUBSTR(LOWER(convert(last_name, 'US7ASCII')),1,LENGTH('Be')) <= LOWER('Be') 
+0

ли 'Bzzz' урожденная d для соответствия? – Toto

ответ

1

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

^((A[b-z])|(B[a-z])|(C[a-h])) 

Он просто проверяет строку, начиная с

  • с последующим BZ ИЛИ
  • B, за которым следует az ИЛИ
  • C, затем ah
0

решение без регулярных выражений

where last_name >= 'Ab' AND where last_name <= 'Ch' 
0

Не уверен, что я хорошо понимаю, но попробовать с:

WHERE REGEXP_LIKE (last_name, '^[A-C][b-h]'); 

или

WHERE REGEXP_LIKE (last_name, '^(A[b-z]|B[a-z]|C[a-h])'); 

i f Bzzz необходимо сопоставить.

+0

, вероятно, не решение, потому что «Bzzzzz» также должен быть принят –

+0

@MarmiteBomber: Не уверен, что это необходимо. Я попросил ОП, подождать и посмотреть ... – Toto

1

Ожидаете ли вы конкретных символов случая, переносов, апострофии (т. O'Brien), расширенные наборы символов?

Вы могли бы использовать:

WHERE SUBSTR(last_name, 1, 2) BETWEEN 'Ab' AND 'Ch' 

Или, независимо от акцентов:

WHERE SUBSTR(UTL_RAW.CAST_TO_VARCHAR2((NLSSORT(last_name, 'nls_sort=binary_ai'))), 1, 2) BETWEEN 'ab' AND 'ch' 

Или, если вы просто ожидая прописной с последующим прописным символом, который вы могли бы также использовать этот регулярные выражение (но это, вероятно, будет менее эффективным, чем использование SUBSTR):

WHERE REGEXP_LIKE(last_name, '^(A[b-z]|B|C[a-h])') 
Смежные вопросы