【问题标题】:Oracle regular expression with different searching parameters具有不同搜索参数的 Oracle 正则表达式
【发布时间】:2013-07-25 07:02:33
【问题描述】:

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

以上可能简单不合逻辑,这只是为了我的练习,以备将来使用。

提前致谢。

【问题讨论】:

标签: sql regex oracle sql-like


【解决方案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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-19
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 2014-06-02
      相关资源
      最近更新 更多