我有一些代碼記錄在Oracle數據庫Oracle,如何匹配varchar中的前導零號碼?
例如:
A00105XYZ
CC000036QWE
如何寫的標準,如果用戶輸入A105XYZ,CC36QWE,這些記錄仍然可以搜索?
我有一些代碼記錄在Oracle數據庫Oracle,如何匹配varchar中的前導零號碼?
例如:
A00105XYZ
CC000036QWE
如何寫的標準,如果用戶輸入A105XYZ,CC36QWE,這些記錄仍然可以搜索?
你可能會想使用正則表達式:
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 ║
╚═════════════╩═════════╝
的一種方法是,以取代雙方0
S:
where replace(code, '0', '') = replace (:var, '0', '')
注意A00105XYZ
也將匹配A15XYZ
。
看看這個作爲一個例子:
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
謝謝你讓我知道我不知道的'utl_match'。但是,我相信OP的準確標準,模糊匹配並沒有幫助。 –
是不是原因沒有完全匹配總是可能是0?或者也可能是其他的東西? –