Monthly Archives: November 2009

Oracle’s TRANSLATE function in SQL Server

— =======================================================================
— Author : Manuel Daponte
— Created: 2009-10-28
— Descrip:

—    Copia barata de la funcion translate de Oracle
—    Al string @expr le busca si contiene alguno de los caracteres
—    del @from y los reemplaza por el caracter en la misma del @to

—    Ejemplo:
—       translate(‘Mañana será mía’, ‘áéíóúñ’, ‘aeiou~’)
—    Retornara:
—       Ma~ana sera mia
— =======================================================================
use Exencion
go
create function translate (
   @expr  varchar(max),
   @from  varchar(50),
   @to    varchar(50)
)
returns varchar(max)
as
begin
   declare @len_expr  smallint  — largo de la expresion donde se haran los reemplazos
   declare @len_from  smallint  — largo del string con los caracteres a reemplazar
   declare @len_to    smallint  — largo del string con los caracteres de reemplazo
 
   — averiguamos los largos de los strings
   select @len_expr = len(@expr), @len_from = len(@from), @len_to = len(@to)
   — no tenemos nada que cambiar
   if @len_expr = 0 or @len_from = 0
      return @expr
 
   declare @char_from char(1)   — para guardar cada caracter que queremos reemplazar
   declare @pos_from  smallint  — en que posicion del @from esta el caracter que estamos procesando

   set @pos_from = 1

   — recorremos el @from
   while (@pos_from <= @len_from)
   begin
      — cual es el equivalente en @to de este caracter
      if @pos_from <= @len_to
      begin
         — el caracter tiene un reemplazo
         set @expr = replace(@expr, substring(@from, @pos_from, 1), substring(@to, @pos_from, 1))
      end
      else
      begin
         — el caracter no tiene un reemplazo
         set @expr = replace(@expr, substring(@from, @pos_from, 1), ”)
      end
      — pasamos al siguiente caracter del @from
      set @pos_from = @pos_from + 1
   end
   return @expr
end
 
 
…Y esta es la manera de ejecutarla:
 
select dbo.translate(‘Mañana será mía, Ñoño!’, ‘áéíóúñ’, ‘aeiou~’)
Ma~ana sera mia, ~o~o!
 
select dbo.translate(‘Mañana será mía, Ñoño!’, ‘áéíóúñ’, ‘a’)
 
Maana sera ma, oo!