我在select查询中需要一个条件返回正确的邮政编码通过处理用户不同的条目,无论它们是输入小写还是大写,是否有空格或数字之间没有空格, 因为我拥有的数据库是大写的,有些邮政编码在数字之间有空格,有些则没有,最后有些邮政编码有3个数字。
答案 0 :(得分:0)
官方英国政府对邮政编码的正则表达是这个怪物:
(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2})
不幸的是,Oracle并不支持except
语法,所以这类事情已经过了[A-Z-[QVX]]
。但我们可以通过regexp_like()
调用运行它的简化版本来验证输入。
这样的事情:
select valid_postcode
from your_table
where regexp_like (upper(:user_input)
, '((GIR 0AA)|((([A-Z][0-9][0-9]?)|(([A-Z][A-Z][0-9][0-9]?)|(([A-Z][0-9][A-HJKPSTUW])|([A-Z][A-Z][0-9][ABEHMNPRVWXY]))))( ?)[0-9][A-Z]{2}))'
and upper(translate(:user_input, 'A ', 'A') = valid_postcode
/
虽然upper(translate(:user_input, 'A ', 'A') = valid_postcode
可能足以满足您的需求。我担心要求不是很清楚。