2010-11-29 40 views
3

我想知道是否有更好的方式來編寫此更新。更好的SQL替換

update Alumni_Export_New 
set phone = replace(replace(replace(replace(phone,'-',''),' ',''),')',''),'(','') 
from tbl 

我在2005年MSSQL存儲過程來清理表中的手機領域,並認爲應該有這樣做,然後我有什麼更好的辦法。

+0

您使用的是什麼風格的SQL? – 2010-11-29 22:16:04

+0

我正在使用MSSQL 2005. – 2010-11-29 22:19:11

+0

它不能解決替換「問題」,但您是否考慮過使用觸發器執行存儲過程清洗?與運行sp的任何時間表相比,清潔工作會立即發生。 – 2010-11-30 07:18:53

回答

0

如果使用Microsoft SQL Server,你應該寫一個用戶定義函數(UDF)來做到這一點

0

假設這是MySQL,我不認爲這是爲多個替換()函數替代參數(如其他dbs中的TRANSLATE())。

+0

MS SQL Server沒有MySQL – JeffO 2010-11-30 01:16:24

1

如果您真的不喜歡REPLACE的外觀,並且您不介意性能受到影響,則可以考慮將替換邏輯放在用戶定義的函數中。否則,你擁有的可能是你最好的解決方案。

樣品:

UPDATE Alumni_Export_New 
SET phone = dbo.StripPhoneNumber(phone) 
FROM tbl 
+0

我有一些其他查詢都將同時運行,所以我認爲這個SP會是最好的。此外,我將這種形式稱爲Coldfusion腳本。被稱爲形式應用程序時,UDF相對於SP的優點是什麼? – 2010-11-29 22:26:26

0

在Oracle您可以使用翻譯功能。

update Alumni_Export_New set phone = translate(phone, '-()', '') from tbl 
0

你有沒有考慮做環槽的所有字符串,如果你只需要數字字符裏面我

CREATE FUNCTION fn_retun_only_numbers 
(
    @myOrgString varchar(50) 
) 
RETURNS varchar(50) 
AS 
BEGIN 
    declare @lenOfString int, @i int 
    declare @oneChar varchar(1),@newString varchar(50) 


    set @lenOfString = (select len(@myOrgString)) 
    set @i = 1 
    set @newString= '' 

    while (@lenOfstring>[email protected]) 
    begin 
    set @oneChar = substring(@myOrgString,@i,1) 

if ((@oneChar)in ('0','1','2','3','4','5','6','7','8','9')) 
begin 
set @[email protected][email protected] 
end 
set @[email protected]+1 
end 
return @newString 
END 
GO 

所以其他提到你現在可以

update Alumni_Export_New 
set phone = dbo.fn_retun_only_numbers(phone) 
from tbl 

我沒有SQL在所以也許在代碼中有一些錯誤

這不是最好的解決方案,但如果你需要確保alwa ys只能獲得數字 也許這是可能的方法之一