我有一些存储在Oracle DB中的手机号码。我有一个存储过程,可以围绕各种验证执行一些检查。存储过程由前端Windows应用程序启动。一个基本的验证示例是确保移动字段不为空。
我想添加验证:检查手机号码是否至少10个字符,并且不计算空格(前后,中间或中间)如果不是,则忽略这些手机号码。
示例:'188 123 4567' '1881234567' '1881234 567'
以上所有数字都应视为有效,其中:
'188 123 456' '188123456' '1881234 567'
应该失败。你能帮助语法吗?我还在学习PL / SQL。
以下是我已经存在的存储过程的摘录:
AND NOT EXISTS
( SELECT *
FROM person_a p
WHERE p.person_id = sa.person_id
AND p.mobile_ph_no = sa.mobile_ph_no
AND pu.a_mobile_ph_no IS NOT NULL
) 如果已存储在DB上的手机号码有误,我只想忽略它。不纠正或以任何方式修改它。如果它不符合标准,请跳过它。
答案 0 :(得分:2)
您可以使用replace
功能。如,
select replace('188 123 4567',' ','') from dual;
结果:
1881234567
replace
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions134.htm
另请参阅“在Oracle数据库中使用正则表达式”http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm
Regexp-es对于像这样的任务非常有用。例如。 regexp_count('188 123 4567','[[:digit:]]')
会返回188 123 4567
中忽略所有非数字字符的位数。
答案 1 :(得分:1)
我认为其他答案没有正确回答他/她所要求的内容。他/她说“如果已存储在数据库中的手机号码有误,我只想忽略它。不纠正它或以任何方式修改它。如果它不符合标准,请跳过它“
其他答案不忽略无效数字,他们通过删除空格来改变它们,然后选择它们。
因此,要仅查询数据库中10位数的电话号码,没有空格而没有其他字符,那么他/她需要这样做...
SELECT * FROM person_a
WHERE REGEXP_LIKE (mobile_ph_no, '^\d{10}$');
所以对于你的查询...
SELECT *
FROM person_a p
WHERE p.person_id = sa.person_id
AND p.mobile_ph_no = sa.mobile_ph_no
AND REGEXP_LIKE (pu.a_mobile_ph_no, '^\d{10}$');
不再需要IS NOT NULL
部分。
您没有提供完整的查询,看起来您正在查询不同表中的几个不同的数字,因此上面的select语句可能不是完全您需要的,但主要的观点是,使用REGEXP_LIKE (pu.a_mobile_ph_no, '^\d{10}$')
答案 2 :(得分:0)
检查删除所有空格的长度的非常简单的代码可以是:
select length(replace('1881234 567',' ','')) from dual