Как преобразовать шаблон RegEx в оператор SQL SELECT для сопоставления строк - PullRequest
0 голосов
/ 16 октября 2019

Необходимо преобразовать шаблон проверки регулярных выражений, используемый для проверки телефонных номеров, в запрос SELECT в SQL для проверки списка телефонных номеров в таблице 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-запрос?

1 Ответ

0 голосов
/ 22 октября 2019

Я удивлен, что никто не ответил на это раньше. это не так уж сложно. Вам нужно объяснить, что не так с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...