如何在 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 中检查电话号码的有效性的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Apache IBANCheckDigit 检查 IBAN 号码?