Oracle正则表达式具有不同的搜索参数

时间:2013-07-25 07:02:34

标签: sql regex oracle sql-like

我对varchar2数据类型的不同国家的牌照数据进行了抽样,没有任何限制:

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

我需要在选择查询中获得以上所有结果,输入:(示例语法)

WHERE plate_number in('kl-ab-1234', 'db 2034', 'klC3341', 'oTher 123', '1234');

搜索输入可以用或不用空格,斜杠,连字符,大写或小写分隔。

我也尝试过使用LIKE,substr,regexp_substr和regexp_replace,但是我没有得到所需的输出。

以上可能 easy 不合逻辑,这仅适用于我即将使用的练习。

提前致谢。

2 个答案:

答案 0 :(得分: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

第一种模式基于德国车牌文本结构的第一手资料,您可以根据需要添加其他模式。因为分隔符是可选的,并且因为它们在字符/数字范围之外,所以在实际匹配之前可以省略它们。期望具有重叠匹配集的模式,将它们保持分离会大大增加可维护性并且不会造成伤害,因为您不需要进行分类。

答案 1 :(得分: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]+', '')));

欢迎任何其他好的解决方案。