A partir de SQL Server 2017, ahora puede usar T-SQL TRANSLATE()
función para traducir uno o más caracteres a otro conjunto de caracteres.
A primera vista, podría pensar que TRANSLATE()
hace exactamente lo mismo que REPLACE()
función, pero hay diferencias significativas entre los dos.
Definiciones
Primero, veamos la definición de cada función:
REPLACE()
- Reemplaza todas las apariciones de un valor de cadena especificado con otro valor de cadena.
TRANSLATE()
- Devuelve la cadena proporcionada como primer argumento después de que algunos caracteres especificados en el segundo argumento se traduzcan a un conjunto de caracteres de destino.
La principal diferencia es cómo cada función trata con múltiples caracteres. REPLACE()
reemplaza una cadena con otra cadena. Por lo tanto, si una cadena contiene varios caracteres, cada carácter debe estar en el mismo orden. TRANSLATE()
por otro lado, reemplaza cada carácter uno por uno, sin importar el orden de esos caracteres.
Ejemplo:mismo resultado
Hay algunos casos en los que ambas funciones devolverán el mismo resultado. Así:
SELECT REPLACE('123', '123', '456') AS Replace, TRANSLATE('123', '123', '456') AS Translate;
Resultado:
Replace Translate ------- --------- 456 456
En este caso, REPLACE()
devuelve 456
porque la cadena exacta en el segundo argumento coincidió con una cadena en el primer argumento (en este caso, era la cadena completa).
TRANSLATE()
devuelve 456
porque cada carácter en el segundo argumento está presente en el primer argumento.
Ejemplo:resultado diferente
Ahora veamos un ejemplo que demuestra una de las diferencias entre TRANSLATE()
y REPLACE()
:
SELECT REPLACE('123', '321', '456') AS Replace, TRANSLATE('123', '321', '456') AS Translate;
Resultado:
Replace Translate ------- --------- 123 654
En este caso, REPLACE()
no tiene ningún efecto (devuelve la cadena original) porque el segundo argumento no es una coincidencia exacta para el primer argumento (o una subcadena dentro de él). Aunque el segundo argumento contiene los caracteres correctos, no están en el mismo orden que el primer argumento y, por lo tanto, la cadena completa no coincide.
TRANSLATE()
lo hace tienen un efecto porque cada carácter en el segundo argumento está presente en el primer argumento. No importa que estén en un orden diferente, porque cada carácter se traduce uno por uno. SQL Server traduce el primer carácter, luego el segundo, luego el tercero y así sucesivamente.
Cadenas no contiguas
Similar al ejemplo anterior, también puede obtener resultados diferentes cuando el primer argumento contiene los caracteres del segundo argumento, pero no son contiguos:
SELECT REPLACE('1car23', '123', '456') AS Replace, TRANSLATE('1car23', '123', '456') AS Translate;
Resultado:
Replace Translate ------- --------- 1car23 4car56
Argumentos de diferente longitud
También puede obtener resultados diferentes entre cada función siempre que haya discrepancias en la cantidad de caracteres en los distintos argumentos.
Aquí hay un ejemplo donde el primer argumento contiene menos caracteres que el segundo y tercer argumento:
SELECT REPLACE('123', '1234', '4567') AS Replace, TRANSLATE('123', '1234', '4567') AS Translate;
Resultado:
Replace Translate ------- --------- 123 456
En este caso, REPLACE()
no tiene efecto porque el segundo argumento contiene más caracteres que el primer argumento. Por lo tanto, es imposible que el primer argumento contenga el segundo argumento.
El TRANSLATE()
Sin embargo, la función tiene un efecto en este caso. Esto se debe a que el segundo argumento contiene caracteres que están en el primer argumento. No importa que el segundo argumento contenga más caracteres que el primero. Lo más importante es que el tercer argumento contenga el mismo número de caracteres que el segundo.
También hay casos en los que REPLACE()
funciona perfectamente pero TRANSLATE()
arroja un error.
Ejemplo:
SELECT REPLACE('1234', '123', '4567') AS Replace;
Resultado:
Replace ------- 45674
En este caso, REPLACE()
funciona como se esperaba.
Sin embargo, si proporcionamos los mismos argumentos a TRANSLATE()
, obtenemos un error:
SELECT TRANSLATE('1234', '123', '4567') AS Translate;
Resultado:
Error: The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters.
Como indica el mensaje de error, el segundo y el tercer argumento deben contener la misma cantidad de caracteres.
¿Cuándo debo usar REEMPLAZAR()?
Deberías usar REPLACE()
cuando necesite reemplazar todas las apariciones de una cadena específica, exactamente como está escrita. Por ejemplo, cambiar el nombre de alguien a otro nombre.
Usando TRANSLATE()
en tales casos puede tener resultados desastrosos:
SELECT REPLACE('Homer Simpson', 'Homer', 'Jason') AS Replace, TRANSLATE('Homer Simpson', 'Homer', 'Jason') AS Translate;
Resultado:
Replace Translate ------------- ------------- Jason Simpson Jason Sispsan
¿Cuándo debo usar TRANSLATE()?
Como se demostró en el ejemplo anterior, TRANSLATE()
La función puede ser útil si necesita reemplazar todas las apariciones de cada carácter especificado, independientemente de su orden dentro de la cadena original.
También se puede usar en lugar de REPLACE()
simplemente el código. Aquí hay un ejemplo (basado en un ejemplo en el sitio web de Microsoft):
SELECT REPLACE(REPLACE(REPLACE(REPLACE('2*[3+4]/{7-2}','[','('), ']', ')'), '{', '('), '}', ')') AS Replace, TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()') AS Translate;
Resultado:
Replace Translate ------------- ------------- 2*(3+4)/(7-2) 2*(3+4)/(7-2)