Удалить и заменить несколько символов (пробелы, дефис, скобки, точка) из строки в SQL - PullRequest
6 голосов
/ 19 марта 2010
+39 235 6595750
19874624611
+44 (0)181 446 5697
+431 6078115-2730
+1 617 358 5128 
+48.40.23755432
+44 1691 872 410
07825 893217
0138 988 1649
(415) 706 2001
00 44 (0) 20 7660 4650
(765) 959-1504
07731 508 486
please reply by email
dont have one
+447769146971

Пожалуйста, смотрите приведенные выше номера телефонов. Мне нужно заменить все пробелы, дефисы, точки, скобки и начальные 0 и т. Д. Из этих чисел. Мне нужен этот формат + 447469186974

Если число имеет начальный знак плюс, не заменяйте его, в противном случае я должен объединить знак + с ним.

* 1006 например *

+ 39 235 6595750 в этом числе мне просто нужно удалить пробелы.

+ 44 (0) 181 446 5697 в этом мне нужно удалить пробелы и скобки и 0 между скобками, т.е. (0)

07825 893217 в этом мне нужно заменить ведущий 0 знаком + и удалить пробелы

(415) 706 2001 в этом месте заменить '(' знаком + и удалить ')' и пробелами.

'пожалуйста, ответьте по электронной почте' Это запись в поле номера телефона, и мне просто нужно проигнорировать это.

+ 48.40.23755432 Удалить точку в номере телефона

(765) 959-1504 Снять скобки и пробелы, дефис и добавить знак + перед номером.

7798724250 просто нужно добавить + знак перед номером

00 44 (0) 20 7660-4650 Необходимо удалить начальные 0 I.E '00' удалить пробелы и скобки и 0 между скобками и дефисом и добавить знак + перед номером

Будет заменено только начальное «0», а не любое другое «0»

Желаемый результат: + 447769146971

Должен ли я использовать вложенные REPLACE, CHARINDES, PATINDES для каждого символа, который я хочу заменить?

Редактировать: Мне не нужно обновлять эти цифры в дБ. Я просто хочу использовать эти числа в своем запросе, чтобы сопоставить эти числа с номерами в журнале вызовов базы данных. В журнале вызовов формат дб всегда такой + 447769146971

Спасибо.

Ответы [ 2 ]

6 голосов
/ 19 марта 2010

попробуй:

SET NOCOUNT ON
DECLARE @Phone table (PhoneNo varchar(50))
INSERT INTO @Phone VALUES ('+39 235 6595750')
INSERT INTO @Phone VALUES ('19874624611')
INSERT INTO @Phone VALUES ('+44 (0)181 446 5697')
INSERT INTO @Phone VALUES ('+431 6078115-2730')
INSERT INTO @Phone VALUES ('+1 617 358 5128 ')
INSERT INTO @Phone VALUES ('+48.40.23755432')
INSERT INTO @Phone VALUES ('+44 1691 872 410')
INSERT INTO @Phone VALUES ('07825 893217')
INSERT INTO @Phone VALUES ('0138 988 1649')
INSERT INTO @Phone VALUES ('(415) 706 2001')
INSERT INTO @Phone VALUES ('00 44 (0) 20 7660 4650')
INSERT INTO @Phone VALUES ('(765) 959-1504')
INSERT INTO @Phone VALUES ('07731 508 486')
INSERT INTO @Phone VALUES ('please reply by email')
INSERT INTO @Phone VALUES ('dont have one')
INSERT INTO @Phone VALUES ('+447769146971')
SET NOCOUNT OFF

;WITH StripNumber AS
(
SELECT
    PhoneNo,
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(PhoneNo
           ,'(','')
           ,')','')
           ,'.','')
           ,' ','')
           ,'-','')
           ,'+','') AS StripNumber
    FROM @Phone
)
SELECT
    CASE
        WHEN ISNUMERIC(StripNumber)=1 THEN '+'+CONVERT(varchar(50),CONVERT(bigint,StripNumber))
        ELSE PhoneNo  --make this ELSE NULL if you don't want to see invalid non numeric phone numbers
    END AS PhoneNumber
    FROM StripNumber

ВЫХОД:

PhoneNumber
---------------------------------------------------
+392356595750
+19874624611
+4401814465697
+43160781152730
+16173585128
+484023755432
+441691872410
+7825893217
+1389881649
+4157062001
+4402076604650
+7659591504
+7731508486
please reply by email
dont have one
+447769146971

(16 row(s) affected)

EDIT

на основании последнего редактирования OP: I don't have to update these numbers in db. I just want to use these numbers in my query to match these numbers... с какой стати вы хотите форматировать число каждый раз, когда выполняете запрос ?? сохранить отформатированные числа в БД, а затем просто присоединиться к ним. Даже если вы просто создадите вычисляемый столбец PERSISTED или представление с индексом по этому форматированному числу, вы получите гораздо лучшую производительность.

2 голосов
/ 19 марта 2010

Одним из решений будет создание функции

 Create Function ExtractDigits( @inVal varChar(50), @EliminateLeadingZeroes TinyInt)
 Returns VarChar(50)
 As
 Begin
     Declare @outVal VarChar(50)
     Set @outVal = ''
     Declare @C Char(1)
     While Len(@Inval) > 0 Begin
         Set @C = Left(@InVal, 1)
         Set @InVal = SubString(@InVal, 2, Len(@InVal) -1)
         If @C Between '0' And '9'
             Set @outVal = @outVal + @C
     End
     If @EliminateLeadingZeroes = 1
        While Left(@outVal,1) = '0'
             Set @OutVal = Substring(@OutVal,2,Len(OitVal) -1)
     Return @OutVal
End

Затем напишите инструкцию обновления следующим образом:

While Exists (Select * From table 
              Where Phone Not Like'+[0-9]%'
Update table Set 
    Phone = '+' + dbo.ExtractDigits(Phone, 1)
Where Phone Not Like'+[0-9]%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...