2014-02-21 21 views
1

我有一些代碼記錄在Oracle數據庫Oracle,如何匹配varchar中的前導零號碼?

例如:

A00105XYZ

CC000036QWE

如何寫的標準,如果用戶輸入A105XYZ,CC36QWE,這些記錄仍然可以搜索?

+0

是不是原因沒有完全匹配總是可能是0?或者也可能是其他的東西? –

回答

4

你可能會想使用正則表達式:

SELECT STR, REGEXP_REPLACE(STR,'([^[:digit:]]*)(0*)(.*)','\1\3') NEW_STR 
FROM 
(SELECT 'A00105XYZ' STR FROM DUAL UNION 
SELECT 'CC000036QWE' STR FROM DUAL UNION 
SELECT 'FD403T' STR FROM DUAL UNION 
SELECT '000000010' STR FROM DUAL) 


╔═════════════╦═════════╗ 
║  STR  ║ NEW_STR ║ 
╠═════════════╬═════════╣ 
║ 000000010 ║ 10  ║ 
║ A00105XYZ ║ A105XYZ ║ 
║ CC000036QWE ║ CC36QWE ║ 
║ FD403T  ║ FD403T ║ 
╚═════════════╩═════════╝ 
1

的一種方法是,以取代雙方0 S:

where replace(code, '0', '') = replace (:var, '0', '') 

注意A00105XYZ也將匹配A15XYZ

0

看看這個作爲一個例子:

with tbl as 
(select 'A00105XYZ' as str 
    from dual 
    union all 
    select 'CC000036QWE' 
    from dual) 
select str, utl_match.edit_distance('A105XYZ', str) chars_off 
    from tbl 
where utl_match.edit_distance('A105XYZ', str) <= 4 

此發現2行測試表的正確行(你給了兩個例子)。原因是因爲它少於或等於4個字符(關閉2個字符)。 (4個或更少的字符必須改爲完全匹配)

測試'CC36QWE',它也可以。 (它是4個字符)

根據需要,您可以將閾值4更改爲任何您想要的值,以增加或減少搜索的模糊程度。

編輯 - 可能要使用編輯距離的相似性,而不是因爲它會更好地說明不同的字符串長度(這是歸0〜1),更多信息請參見http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/u_match.htm#ARPLS71217

+0

謝謝你讓我知道我不知道的'utl_match'。但是,我相信OP的準確標準,模糊匹配並沒有幫助。 –