我对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 或不合逻辑,这仅适用于我即将使用的练习。
提前致谢。
答案 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]+', '')));
欢迎任何其他好的解决方案。