1. 程式人生 > >SQLServer實現Oracle中的translate函式

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')

begin
drop 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 @
[email protected]

              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