SQLServer實現Oracle中的translate函式
在看SQLCOOKBOOK的時候,裡面涉及到提取純英文或者提取純中文,ORACLE因為有translate函式的關係可以很方便的進行剔除。但是放到SQLSERVER中,總會提及沒有translate函式所以無法實現。最後煩了,思考了一下自己寫了一個出來
本來考慮直接一個個replace就行了,後來發現自己too simple。因為replace的時候是有先後順序的,比如把‘ab’translate成'ba',等你把‘a’replace成‘b’的時候,就無法繼續把'b'replace成'a',結果不符。
能想到的解決方案就是進行substring分割,然後在結果連結起來。不過需要在內部複製一個字串。一個字串用於查詢位置,然後在複製上進行更改。
現在已經實現了
/*
例:
declare @before nvarchar(500),@end nvarchar(10),@result nvarchar(500),@i int
set @result ='456789中文789456'
set @before='456789'
set @end ='789456'
select dbo.translate(@result,@before,@end)
結果:
789456中文456789
即,將4變成7,將5變成8,將6變成9,將7變成4,將8變成5,將9變成6
如果第二個引數(@before)多餘第三個引數(@end)
會將@before多餘的字元全部置為空
例:
declare @before nvarchar(500),@end nvarchar(10),@result nvarchar(500),@i int
set @result ='456789中文12315646546中國789456'
set @before='0123456789'
set @end =''
select dbo.translate(@result,@before,@end)
結果:
中文中國
*/
以下是原始碼:
if exists(select 1 from sysobjects where name ='translate')
begindrop FUNCTION translate
end
go
create FUNCTION translate
(
@result nvarchar(500),
@from nvarchar(500),
@to nvarchar(500)
)
returns nvarchar(500)
as
begin
declare @i int ,@j int,@result1 nchar(500)
if(len(@from)=len(@to))
begin
set @
set @i=1
while @i<=LEN(@from)
begin
set @j=0;
while charindex(substring(@from,@i,1),@result,@j)>0
begin
set @j=charindex(substring(@from,@i,1),@result,@j)
set @result1=left(@result1,@j-1)+substring(@to,@i,1)+substring(@result1,@j+1,len(@result1));
set @[email protected]+1
end
set @[email protected]+1
end
end
else if(len(@from)>len(@to))
begin
set @i=1
declare @duoyu nchar(500)
set @duoyu=right(@from,len(@from)-len(@to))
while @i<=len(@duoyu)
begin
set @result=replace(@result,substring(@duoyu,@i,1),'')
set @[email protected]+1;
end
set @[email protected]
set @i=1
while @i<=LEN(@to)
begin
set @j=0;
while charindex(substring(@from,@i,1),@result,@j)>0
begin
set @j=charindex(substring(@from,@i,1),@result,@j)
set @result1=left(@result1,@j-1)+substring(@to,@i,1)+substring(@result1,@j+1,len(@result1));
set @[email protected]+1
end
set @[email protected]+1
end
end
return @result1
end