Oracle,如何匹配varchar中的前导零数?

时间:2014-02-21 03:44:27

标签: sql oracle varchar

我在Oracle DB中有一些代码记录

例如:

A00105XYZ

CC000036QWE

如何编写标准,如果用户输入A105XYZ,CC36QWE,仍然可以搜索这些记录?

3 个答案:

答案 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