繁体   English   中英

如何将 RegEx 模式转换为 SQL SELECT 语句以进行字符串匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM