Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove and Replace multiple chars ( spaces, hyphen, brackets, period) from string in sql

+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

Please see the above given phone numbers. I need to replace all spaces, hyphen, period, brackets and leading 0 etc from these numbers. I need this format +447469186974

If number has leading plus sign then don't replace it otherwise I have to concatenate + sign with it.

E.G

+39 235 6595750 in this number I just need to remove spaces.

+44 (0)181 446 5697 in this i need to removes spaces and brackets and 0 in between brackets i.e (0)

07825 893217 in this I need to replace leading 0 with + sign and remove spaces

(415) 706 2001 in this replace '(' with + sign and remove ')' and spaces.

'please reply by email' This is the entry in phone number field and I just need to ignore this.

+48.40.23755432 Remove period in phone number

(765) 959-1504 Remove brackets and spaces and hyphen and add + sign in front of number.

7798724250 just need to add + sign in front of number

00 44 (0) 20 7660-4650 Need to remove leading 0 I.E '00' remove spaces and brackets and 0 in between brackets and hyphen and add + sign in front of number

Only leading '0' will be replaced not anyother occourence of '0'

The desired result is +447769146971

Should I use nested REPLACE, CHARINDES, PATINDES for each char I want to replace?

Edit: I don't have to update these numbers in db. I just want to use these numbers in my query to match these numbers with numbers in call log db. In call log db format is always like this +447769146971

Thanks.

like image 549
Kashif Avatar asked Mar 19 '10 13:03

Kashif


People also ask

How do I replace multiple characters in a string in SQL?

Using the REPLACE() function will allow you to change a single character or multiple values within a string, whether working to SELECT or UPDATE data.

How do you remove spaces and special characters from a string in SQL Server?

The TRIM() function removes the space character OR other specified characters from the start or end of a string. By default, the TRIM() function removes leading and trailing spaces from a string.

How replace all occurrences of a string in SQL?

SQL Server REPLACE() Function The REPLACE() function replaces all occurrences of a substring within a string, with a new substring. Note: The search is case-insensitive.


2 Answers

give this a try:

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

OUTPUT:

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

based on OP's latest edit: I don't have to update these numbers in db. I just want to use these numbers in my query to match these numbers... why on earth would you want to format the number each time you run your query?? store the formatted numbers in the DB and then just join on them. Even if you just make a PERSISTED computed column or an view with an indexed on this formatted number, you'd have much better performance.

like image 121
KM. Avatar answered Oct 29 '22 21:10

KM.


One solution would be to Create a function

 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

Then write Update Statement like this:

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]%'
like image 26
Charles Bretana Avatar answered Oct 29 '22 20:10

Charles Bretana