2016-10-11 97 views
-1

我有數據庫中的電話號碼字段。它已經有數據。更改電話號碼格式

我想將我的電話號碼格式更改爲「XXX-XXX-XXXX」 當前數據庫沒有任何電話格式。

所以可能會有垃圾數據。我已經爲新記錄應用驗證,但現在我也想更改現有數據。

有什麼具體的方法可以改變我現有的數據。並使所有電話號碼遵循此格式。

請指教。

+3

剝去數據庫中的所有非數字字符,並應用所需格式1.在客戶端應用程序中; 2.在SQL中選擇來自數據庫的數據;或者3。在表格上創建一個計算列,它將動態應用格式,並選擇該列而不是未格式化的列值 –

+0

嗯,我想這樣做。但是如何?任何查詢都會有所幫助。 –

+1

您首先需要刪除任何現有的格式化字符。最可能的字符是() - 和一個空格。我的首選是將格式保留到前端應用程序,並從數據庫中獲取所有格式化字符和邏輯。 –

回答

2

創建函數刪除非數字數據,並做格式化

CREATE FUNCTION [UDF_STRIP_NONNUMERIC_DATA](@str VARCHAR(8000)) 
RETURNS VARCHAR(8000) 
AS 
    BEGIN 
     WHILE Patindex('%[^0-9]%', @str) > 0 
     BEGIN 
      SET @str = Stuff(@str, Patindex('%[^0-9]%', @str), 1, '') 
     END 

     RETURN @str 
    END 

可以使用STUFF功能插頁的-

Select left(Stuff(Stuff(dbo.[UDF_STRIP_NONNUMERIC_DATA](Phone),4,0,'-'),8,0,'-'),12) 
From yourtable 

之間phone

如果您正在使用 SQL SERVER 2012+使用會使用 FORMAT函數(感謝LukStorms,在評論中提到它)

SELECT Format(Cast(dbo.[Udf_strip_nonnumeric_data](Phone) AS BIGINT), '###-###-####') 
FROM yourtable 

要更新

Update yourtable 
    SET phone = left(Stuff(Stuff(dbo.[UDF_STRIP_NONNUMERIC_DATA](Phone),4,0,'-'),8,0,'-'),12) 

演示

declare @str varchar(100)= '9225-123-4567' 

select left(Stuff(Stuff(dbo.[UDF_STRIP_NONNUMERIC_DATA](@str),4,0,'-'),8,0,'-'),12) 

結果:922-512-3456

+0

不能按預期方式工作舊數據:9225-123-4567 - 使用您的查詢轉換爲:92-5-1-3-4567 –

+0

現在它不適用於具有正確數據的記錄。試用「555-555-5555」。它會被轉換成「555-555-55」 –

+0

@PiyushKhatri更新了現在檢查 –

0

好,以取代所有非數字字符,看this

下面是一個示例腳本(從該鏈接複製),向你展示它是如何工作(你需要修改這個以適應你的表名和列名:

-- Step 1: creates table to use to hold every char in every phone number 
if object_id('dbo.tally') is not null drop table dbo.tally 
    select top 10000 --change to fit max length of phone number 
    identity(int,1,1) as n 
    into dbo.tally 
    from master.dbo.syscolumns sc1, 
     master.dbo.syscolumns sc2 

-- add pk to maximize performance 
    alter table dbo.tally 
    add constraint pk_tally_n 
     primary key clustered (n) with fillfactor = 100 

-- Step 2: Create temporary table holding three bad phone numbers 
declare @phonetable table 
    (uniqueid int identity(1,1), 
    phone_number varchar(500)) 
    insert into @phonetable (phone_number) 
    select '-567-890' union 
    select 'ext' union 
    select 'n/a' union select '...12345.....'; 

-- Step 3: identify, for every character, whether it is a number or not, 
      and remove the non-numeric ones 
with cte (uniqueid, phone_number, goodchar, badchar) as 
(select uniqueid, phone_number, 
     case when substring(phone_number,N,1) not like '%[^0-9]%' 
      then substring(phone_number,N,1) end as goodchar, 
     case when substring(phone_number,N,1) like '%[^0-9]%' 
      then substring(phone_number,N,1) end as badchar 
    from @phonetable , Tally 
    where phone_number like '%[^0-9]%' and N <= len(phone_number)) 
    select distinct phone_number, 
     isnull(stuff ( 
        (SELECT '' + goodchar 
       FROM cte t1 
     where t1.UniqueID = t2.UniqueID 
      FOR XML PATH ('')) , 1 , 0 , '') ,'') 
         as clean_phone_number from cte t2 

與顯示的數字格式化,只提取相應的碎片,並與破折號重新將它們連接起來。

Select case len(phone) 
     When 10 then left(phone, 3) + '-' + 
        substring(phone, 4,3) + '-' + 
        substring(phone, 7,4)` 
     When 7 then left(phone, 3) + '-' + 
        substring(phone, 4,4) 
     Else '' end 

要創建一個計算列

Alter table Add Column FormattedPhone as 
    case len(phone) 
     When 10 then left(phone, 3) + '-' + 
        substring(phone, 4,3) + '-' + 
        substring(phone, 7,4)` 
     When 7 then left(phone, 3) + '-' + 
        substring(phone, 4,4) 
     Else '' end 
1
declare @phone varchar(24) 
set @phone = '(334)789-4532' 
--set @phone = '314789-4532' 
--set @phone = '3457894532' 
--set @phone = '534-789-4532' 

SELECT 
    LEFT(N,3) + '-' + SUBSTRING(N,4,3) + '-' + RIGHT(N,4) 
FROM 
    (SELECT CAST(CAST((
      SELECT SUBSTRING(@phone, Number, 1) 
      FROM master..spt_values 
      WHERE Type='p' AND Number <= LEN(@phone) AND 
       SUBSTRING(@phone, Number, 1) LIKE '[0-9]' FOR XML Path('')) 
     AS xml) AS varchar(MAX)) as N) as N 
0

如果你不介意UDF

Select [dbo].[udf-Str-Format-Phone]('334)789-4532') 

返回

334-789-4532 

的UDF

CREATE FUNCTION [dbo].[udf-Str-Format-Phone] (@S varchar(max)) 
Returns varchar(25) 
AS 
Begin 
    Declare @Return varchar(25) 

    ;with cte0(N) As (Select 1 From (Values(1),(1),(1),(1),(1)) N(N)) 
     , cteN(N) As (Select Top (Len(@S)) Row_Number() over (Order By (Select NULL)) From cte0 N1, cte0 N2) 
     , cteS(S) As (Select Substring(@S,N,1) From cteN Where Substring(@S, N, 1) LIKE '[0-9]' FOR XML Path('')) 

    Select @Return = IIf(Len(S)>=10,Stuff(stuff(S,4,0,'-'),8,0,'-'),Stuff(S,4,0,'-')) From cteS 
    Return @Return 

End 
-- Syntax : Select [dbo].[udf-Str-Format-Phone]('(334)789-4532') -- Returns 334-789-4532 
-- Syntax : Select [dbo].[udf-Str-Format-Phone]('Phone:7894532') -- Returns 789-4532