如何在 SQL 中检查电话号码的有效性

Posted

技术标签:

【中文标题】如何在 SQL 中检查电话号码的有效性【英文标题】:How to check validity of phone number in SQL 【发布时间】:2021-09-08 08:52:05 【问题描述】:

我编写了以下查询来打印电话号码不是 10 位数字的所有行,或者它是否包含任何字母但它不起作用。谁能告诉我为什么它不起作用

SELECT * FROM table_name WHERE Phone_number NOT LIKE '[0-9]*10';

【问题讨论】:

您使用的是 mysql 还是 Oracle? (我怀疑这两个的答案是否相同。) 我正在使用 Oracle 尝试使用 REGEXP_LIKE NANP(“10 位”)电话号码的验证规则比“每个字符都是一个数字”更严格,例如,3 位区号不能以 1 开头。如果您真的想要验证您的数据库,您应该在应用程序代码中使用libphonenumber 或类似方法进行验证,因为 PL/SQL 根本无法正确和彻底地验证电话号码。 我同意@Dai - 要么使用 libphnone 编号作为 Java 存储过程,要么将整个逻辑移到应用程序中并在应用程序端执行此检查。 【参考方案1】:

考虑到电话号码有更复杂的规则,你可以使用这样的东西。

我展示了不同的前提,您可以获得更好的想法:

数据演示

SQL> create table test_phone ( phone_number varchar2(20) ) ;

Table created.

SQL> insert into test_phone values ( '4429239220' ); -- 10 digits

1 row created.

SQL> insert into test_phone values ( '10229383890' ); -- 11 digits 

1 row created.

SQL>  insert into test_phone values ( 'GE4914098998833' ); -- contains letters

1 row created.

SQL> insert into test_phone values ( 'AGCD292911' ); -- 10 digits but letters

 1 row created.

前提:仅限10位

SQL> select * from test_phone where regexp_like(phone_number,'^[[:digit:]]10$') ;

PHONE_NUMBER
--------------------
4429239220

前提(10位或任何带字母的数字)

SQL>  select * from test_phone where regexp_like(phone_number,'^[a-zA-Z0-9-]10*$');

PHONE_NUMBER
--------------------
4429239220
AGCD292911

前提不是(10位数字或字母)

SQL>  select * from test_phone where not regexp_like(phone_number,'^[a-zA-Z0-9-]10*$');

PHONE_NUMBER
--------------------
10229383890
GE4914098998833

前提:只有那些不是 10 位数字且不包含任何字母的记录。不用正则表达式也能实现

SQL> select * from test_phone where lengthc(phone_number) != 10 and validate_conversion(phone_number as number)=1
  2  ;

PHONE_NUMBER
--------------------
10229383890

【讨论】:

@Sarah,有什么反馈吗?【参考方案2】:

我使用NOT REGEXP得到它:

SELECT
    *
FROM
    table_name
WHERE
    Phone_number NOT LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

【讨论】:

它在 W3 学校编辑器中工作,但在 Oracle 中不工作 LIKE 不支持(标准)SQL 和 Oracle 中的正则表达式。另一个很好的例子为什么你不应该依赖来自 w3fools 的信息 在 Oracle 中,LIKE 使用通配符,这与正则表达式不同。此外,您可以使用[0-9]10,而不是重复正则表达式[0-9] 10 次。不过,这仍然不是一个完美的验证检查,例如它会匹配 'banana1234567890'

以上是关于如何在 SQL 中检查电话号码的有效性的主要内容,如果未能解决你的问题,请参考以下文章

pl sql oracle中有效的蜂窝号码

检查有效的印度移动电话号码

如何使用 Apache IBANCheckDigit 检查 IBAN 号码?

如何检查只有信用卡号有效而不是借记卡..?

当用户点击第 11 个号码时,如何验证输入文本(在 html 中)是不是是有效的电话号码?

如何在 C++ 中将字符串转换为 int?