2013-07-25 53 views
0

我已經varchar2數據類型的不同國家的車牌號碼的樣本數據,沒有任何限制都:不同的搜索甲骨文正則表達式參數

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

我需要在一個SELECT查詢所有上述結果,對於輸入:(語法示例)

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]+', ''))); 

有任何其他好的解決方案是受歡迎的。