检查字符串长度&忽略空格

时间:2014-02-11 16:24:23

标签: sql oracle stored-procedures plsql

我有一些存储在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上的手机号码有误,我只想忽略它。不纠正或以任何方式修改它。如果它不符合标准,请跳过它。

3 个答案:

答案 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数据库SQL参考

另请参阅“在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