我有數據庫中的電話號碼字段。它已經有數據。更改電話號碼格式
我想將我的電話號碼格式更改爲「XXX-XXX-XXXX」 當前數據庫沒有任何電話格式。
所以可能會有垃圾數據。我已經爲新記錄應用驗證,但現在我也想更改現有數據。
有什麼具體的方法可以改變我現有的數據。並使所有電話號碼遵循此格式。
請指教。
我有數據庫中的電話號碼字段。它已經有數據。更改電話號碼格式
我想將我的電話號碼格式更改爲「XXX-XXX-XXXX」 當前數據庫沒有任何電話格式。
所以可能會有垃圾數據。我已經爲新記錄應用驗證,但現在我也想更改現有數據。
有什麼具體的方法可以改變我現有的數據。並使所有電話號碼遵循此格式。
請指教。
創建函數刪除非數字數據,並做格式化
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
不能按預期方式工作舊數據:9225-123-4567 - 使用您的查詢轉換爲:92-5-1-3-4567 –
現在它不適用於具有正確數據的記錄。試用「555-555-5555」。它會被轉換成「555-555-55」 –
@PiyushKhatri更新了現在檢查 –
好,以取代所有非數字字符,看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
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
如果你不介意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
剝去數據庫中的所有非數字字符,並應用所需格式1.在客戶端應用程序中; 2.在SQL中選擇來自數據庫的數據;或者3。在表格上創建一個計算列,它將動態應用格式,並選擇該列而不是未格式化的列值 –
嗯,我想這樣做。但是如何?任何查詢都會有所幫助。 –
您首先需要刪除任何現有的格式化字符。最可能的字符是() - 和一個空格。我的首選是將格式保留到前端應用程序,並從數據庫中獲取所有格式化字符和邏輯。 –