sql - 如何将 RegEx 模式转换为 SQL SELECT 语句以进行字符串匹配
问题描述
需要将用于验证电话号码的正则表达式验证模式转换为 SQL 中的 SELECT 查询,以验证 SQL 表中的电话号码列表
Regex = ^\s*1?[ \-\(\.\/]*[2-9]\d{2}[ \-\.\(\)\/]*[2-9]\d{2}[ \-\.\(\)\/]*\d{4}\s*$|^\s*011[ \-]*[2-9][ \-\(\.\/\)\,\d]
我已经尝试使用 PATINDEX 函数来传递上述表达式。以下是我的查询
DROP TABLE #PhoneNumberList
SELECT * INTO #PhoneNumberList
FROM (
SELECT '8049901000' AS PhoneNumber, 'Valid' as ValidationResultNeeded
UNION
SELECT '800-200-1000', 'Valid'
UNION
SELECT '1000900000' , 'Invalid'
UNION
SELECT '4053366463' , 'Valid'
UNION
SELECT '(405)334-5665' , 'Valid'
UNION
SELECT '405334(6463)' , 'Invalid'
union
SELECT '7341234321' , 'Invalid'
UNION
SELECT '3961573999' , 'Invalid'
UNION
SELECT '40533406463' , 'Invalid'
)A
SELECT * , Patindex('^\s*1?[ \-\(\.\/]*[2-9]\d{2}[ \-\.\(\)\/]*[2-9]\d{2}[ \-\.\(\)\/]*\d{4}\s*$|^\s*011[ \-]*[2-9][ \-\(\.\/\)\,\d]+$',PhoneNumber) AS RegExValidation
FROM #PhoneNumberList
order by 2
我得到所有电话号码的零值。对于无效的电话号码,我期望得到一个非 0 的值。我是否正确使用此功能以获得正确的验证?还是有另一种方法来编写这个 SQL 语句?
解决方案
我很惊讶没有人早点回答这个问题。这不是太难。您需要解释 3961573999 和 7341234321 有什么问题......我正在为这些返回“有效”,因为它们似乎是有效的电话号码。
SELECT
p.PhoneNumber,
ValidationResultNeeded =
CASE WHEN
(PATINDEX('([2-9][0-9][0-9])[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]', p.PhoneNumber) ^
PATINDEX('[2-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]', p.PhoneNumber) ^
PATINDEX('[2-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]', p.PhoneNumber)) <> 0
THEN 'valid' ELSE 'invalid' END
FROM #PhoneNumberList AS p;
结果:
PhoneNumber ValidationResultNeeded
--------------- ----------------------
(405)334-5665 valid
1000900000 invalid
3961573999 valid
405334(6463) invalid
40533406463 invalid
4053366463 valid
7341234321 valid
800-200-1000 valid
8049901000 valid
推荐阅读
- javascript - 为什么服务器响应状态为 415 - API Post Method
- c++ - 在 for 循环 C++ 中添加来自先前迭代的元素
- c++ - vscode代码静态分析时找不到'opencv2/opencv.hpp'文件
- winapi - WinAPI - 如何使所有者绘制按钮表现得像一个按钮?
- vim - 如何在vim中回到以前的模式
- django - 如何为 Django 编写 QuerySet 以获取模型计数
- javascript - 如何在 ReactJS 中将 blob 转换为 MP3?
- java - 错误:在类中找不到主要方法。请将主要方法定义为:public static void main(String[] args)
- postgresql - 插入语句中不存在的地方 - POSTGRESQL
- wordpress - 如何禁用模板中声明的 Gutenberg InnerBlock 元素的工具栏?