2013-07-25 3 views
0

Я выборочные данные чисел пластин разных стран varchar2 типа данных, никаких ограничений на всех:Oracle регулярного выражения с различным поиском параметров

plate_number 
------- 
KL AB 1234 
DB-2034 
kl_c_3341 
12/34 
other123 

мне нужно, чтобы получить все приведенные выше результаты в запросе на выборке, для ввода: (синтаксиса образца)

WHERE plate_number in('kl-ab-1234', 'db 2034', 'klC3341', 'oTher 123', '1234'); 

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

Я пробовал использовать LIKE, substr, regexp_substr и regexp_replace тоже, но я не получаю желаемый результат.

выше может быть легко или не логично, это только для моей практики для предстоящего использования.

Заранее спасибо.

+1

Помогает ли это? http://stackoverflow.com/questions/16336295/search-for-similar-words-using-an-index –

+0

Да, действительно!. Позвольте мне попробовать. – ajmalmhd04

ответ

1

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

WHERE REGEXP_INSTR (
      REGEXP_REPLACE(plate_number, '[ -/]', '') 
     ,    '^(' 
        || '[[:alpha:]]{1,3}[[:alpha:]]{1,2}[[:digit:]]{2,4}' 
      || '|' || '[[:alpha:]]{2}[[:digit:]]{4}' 
      || '|' || '[[:alpha:]]+[[:digit:]]{3}' 
      || '|' || '[[:digit:]]{4}' 
        || ')$' 
     , 1, 1, 0 
     , 'i' 
    ) > 0 

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

+0

Спасибо за код, это действительно полезно .. – ajmalmhd04

0

Спасибо @ A.B.Cade, и это то, что я получил от link

SELECT * 
FROM my_table3 
WHERE lower(regexp_replace(word, '[^0-9a-zA-Z]+', '')) IN(
lower(regexp_replace('kl-ab-1234' , '[^0-9a-zA-Z]+', '')), 
lower(regexp_replace('db 2034' , '[^0-9a-zA-Z]+', '')), 
lower(regexp_replace('klC3341' , '[^0-9a-zA-Z]+', '')), 
lower(regexp_replace('oTher 123' , '[^0-9a-zA-Z]+', '')), 
lower(regexp_replace('1234 ' , '[^0-9a-zA-Z]+', ''))); 

любого другого хорошего решения приветствуется.

Смежные вопросы