我想知道是否有更好的方式來編寫此更新。更好的SQL替換
update Alumni_Export_New
set phone = replace(replace(replace(replace(phone,'-',''),' ',''),')',''),'(','')
from tbl
我在2005年MSSQL存儲過程來清理表中的手機領域,並認爲應該有這樣做,然後我有什麼更好的辦法。
我想知道是否有更好的方式來編寫此更新。更好的SQL替換
update Alumni_Export_New
set phone = replace(replace(replace(replace(phone,'-',''),' ',''),')',''),'(','')
from tbl
我在2005年MSSQL存儲過程來清理表中的手機領域,並認爲應該有這樣做,然後我有什麼更好的辦法。
如果使用Microsoft SQL Server,你應該寫一個用戶定義函數(UDF)來做到這一點
假設這是MySQL,我不認爲這是爲多個替換()函數替代參數(如其他dbs中的TRANSLATE())。
MS SQL Server沒有MySQL – JeffO 2010-11-30 01:16:24
如果您真的不喜歡REPLACE
的外觀,並且您不介意性能受到影響,則可以考慮將替換邏輯放在用戶定義的函數中。否則,你擁有的可能是你最好的解決方案。
樣品:
UPDATE Alumni_Export_New
SET phone = dbo.StripPhoneNumber(phone)
FROM tbl
我有一些其他查詢都將同時運行,所以我認爲這個SP會是最好的。此外,我將這種形式稱爲Coldfusion腳本。被稱爲形式應用程序時,UDF相對於SP的優點是什麼? – 2010-11-29 22:26:26
在Oracle您可以使用翻譯功能。
update Alumni_Export_New set phone = translate(phone, '-()', '') from tbl
你有沒有考慮做環槽的所有字符串,如果你只需要數字字符裏面我
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只能獲得數字 也許這是可能的方法之一
您使用的是什麼風格的SQL? – 2010-11-29 22:16:04
我正在使用MSSQL 2005. – 2010-11-29 22:19:11
它不能解決替換「問題」,但您是否考慮過使用觸發器執行存儲過程清洗?與運行sp的任何時間表相比,清潔工作會立即發生。 – 2010-11-30 07:18:53