2013-05-24 2 views
3

Я хочу, чтобы получить номер телефона текстовой строки, которая соответствует определенным условиям:SQL Regex прибудет номер телефон

  • 9 символов (цифры)
  • Вы можете начать только в 9,8,7,6

Я попытался с выражением:

'^\(?(9|8|7|6)\)?([0-9]{8}))$' 

в следующей функции:

DECLARE @str VARCHAR(MAX) 
DECLARE @validchars VARCHAR(MAX) 

SET @str = 'TESTING1234 997711056' 
SET @validchars = '^\(?(9|8|7|6)\)?([0-9]{8}))$' 

WHILE PATINDEX('%' + @validchars + '%',@str) > 0 
SET @str=REPLACE(@str, SUBSTRING(@str ,PATINDEX('%'+ @validchars +'%',@str), 1) ,'') 


SELECT @str 

Мне нужно получить 997711056, но я всегда получаю полную текстовую строку. Какая у меня ошибка?

ответ

5

PATINDEX не является регулярным выражением. Вы можете использовать только ограниченный набор идентификаторов шаблонов и подстановочных знаков. От MSDN:

%: Любая строка из ноля или более символов.
_ (подчеркивание): Любой символ.
[]: Любой символ в указанном диапазоне ([a-f]) или set ([abcdef]).
[^]: Любой отдельный символ не в указанном диапазоне ([^ a-f]) или установлен ([^ abcdef]).

Ниже будет соответствовать девять цифр подряд, начиная с 6, 7, 8 или 9:

SET @validchars = '[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' 

Использование SUBSTRING также неправильно. Похоже, ваш код пытается исключить символы номера из строки. Вот как получить строку с номером удалены:

DECLARE @str VARCHAR(MAX) 
DECLARE @validchars VARCHAR(MAX) 

SET @str = 'TESTING1234 997711056 sdfgdfg' 
SET @validchars = '[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' 
DECLARE @idx INT 
SET @idx = PATINDEX('%'+ @validchars +'%',@str) 
IF @idx > 0 AND 
    (@idx = LEN(@str)-8 
    OR PATINDEX(SUBSTRING(@str,@idx+9,1),'[0-9]')=0) 
    SET @str=REPLACE(@str,SUBSTRING(@str ,PATINDEX('%'+ @validchars +'%',@str), 9),'') 
ELSE SET @str = '' 
SELECT @str 

Вы утверждаете вы хотите, чтобы получить только число из строки; Вот как это сделать:

DECLARE @str VARCHAR(MAX) 
DECLARE @validchars VARCHAR(MAX) 

SET @str = 'TESTING1234 997711056 sdfgdfg' 
SET @validchars = '[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' 
DECLARE @idx INT 
SET @idx = PATINDEX('%'+ @validchars +'%',@str) 
IF @idx > 0 AND 
    (@idx = LEN(@str)-8 
    OR PATINDEX(SUBSTRING(@str,@idx+9,1),'[0-9]')=0) 
    SET @str=SUBSTRING(@str ,PATINDEX('%'+ @validchars +'%',@str), 9) 
ELSE SET @str = '' 
SELECT @str 
+1

спасибо за помощь и полезную информацию – csotelo

+0

, но проверяю ... Я все еще возвращаю одну и ту же строку: S – csotelo

+0

@csotelo Отредактированный ответ, чтобы показать, как получить строку с номером или без него и точно соответствовать девяти цифрам. –

2

Попробуйте с этим:

DECLARE @str VARCHAR(MAX) 

---- returns 997711056 
SET @str= 'TESTING1234 997711056' 
---- returns NULL 
--SET @str= 'TESTING1234 0997711056' 
---- returns NULL 
--SET @str= 'TESTING1234 9977110560' 
---- returns 997711056 
--SET @str= '997711056' 
---- returns NULL 
--SET @str= '0997711056' 
---- returns NULL 
--SET @str= '9977110560' 
---- returns NULL 
--SET @str= 'test' 

DECLARE @pat NVARCHAR(100) = '%[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%' 
DECLARE @len INT = 9 
DECLARE @ind INT = PATINDEX(@pat, @str) 

SELECT CASE WHEN 
      ISNUMERIC(SUBSTRING(@str, @ind - 1, 1)) = 1 OR ISNUMERIC(SUBSTRING(@str, @ind + @len, 1)) = 1 THEN NULL 
     ELSE 
      SUBSTRING(@str, NULLIF(@ind, 0), @len) 
     END 

PATINDEX не предназначен, чтобы соответствовать регулярные выражения, для его использования читать MSDN article about it

Если вы просто хотите, чтобы извлечь номер вам не нужен цикл WHILE.

В случае отсутствия 9-значного номера, начинающегося с цифр 6-9 в строке, этот код вернет NULL.

+0

спасибо за помощь – csotelo

+0

Я рад помочь :) –

+0

Единственная проблема, когда есть 9 + телефонные символы ... Вы можете быть строгими по количеству? (без подстроки) – csotelo

Смежные вопросы