[英]How to convert RegEx pattern into a SQL SELECT statement for string matching
需要将用于验证电话号码的正则表达式验证模式转换为 SQL 中的 SELECT 查询,以验证 SQL 表中的电话号码列表
Regex = ^\s*1?[ \-\(\.\/]*[2-9]\d{2}[ \-\.\(\)\/]*[2-9]\d{2}[ \-\.\(\)\/]*\d{4}\s*$|^\s*011[ \-]*[2-9][ \-\(\.\/\)\,\d]
我已经尝试使用 PATINDEX function 来传递上述表达式。 以下是我的查询
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 的值。 我是否正确使用此 function 来获得正确的验证? 还是有另一种方法来编写这个 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.