我在Oracle DB中有一些代码记录
例如:
A00105XYZ
CC000036QWE
如何编写标准,如果用户输入A105XYZ,CC36QWE,仍然可以搜索这些记录?
答案 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 :(得分:1)
一种方法是替换双方的0
:
where replace(code, '0', '') = replace (:var, '0', '')
请注意,A00105XYZ
也会匹配A15XYZ
。
答案 2 :(得分: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行测试表的正确行(您给出的2个示例)。原因是因为它小于或等于4个字符(它关闭了2个字符)。 (必须更改4个或更少的字符才能完全匹配)
使用'CC36QWE'测试,它也有效。 (这是4个字符)
您可以根据需要将阈值4更改为您想要的任何值,以增加或减少搜索的模糊性。
编辑 - 可能希望使用编辑距离相似性,因为它会更好地考虑不同的字符串长度(它的标准化为0到1),有关详细信息,请参阅http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/u_match.htm#ARPLS71217