0

我有不同国家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,但我没有得到想要的输出。

以上可能很容易不合逻辑,这仅用于我的练习以备将来使用。

提前致谢。

4

2 回答 2

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

第一个模式基于对德国车牌文本结构的第一手知识,您可以根据需要添加其他模式。因为分隔符无论如何都是可选的,并且由于它们超出了字符/数字范围,因此可以在实际匹配之前将其省略。期望具有重叠匹配集的模式,将它们分开极大地增加了可维护性并且没有害处,因为您不需要分类。

于 2013-07-25T08:25:22.697 回答
0

谢谢@ABCade,这就是我从链接中得到的

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]+', '')));

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

于 2013-07-25T08:16:34.677 回答