A partir do SQL Server 2017, agora você pode usar o T-SQL
TRANSLATE()
função para traduzir um ou mais caracteres em outro conjunto de caracteres. À primeira vista, você pode pensar que o
TRANSLATE()
função faz exatamente a mesma coisa que a função REPLACE()
função, mas existem diferenças significativas entre os dois. Definições
Primeiro, vamos ver a definição de cada função:
REPLACE()
- Substitui todas as ocorrências de um valor de string especificado por outro valor de string.
TRANSLATE()
- Retorna a string fornecida como primeiro argumento após alguns caracteres especificados no segundo argumento serem convertidos em um conjunto de caracteres de destino.
A principal diferença é como cada função lida com vários caracteres.
REPLACE()
substitui uma string por outra string. Portanto, se uma string contiver vários caracteres, cada caractere deverá estar na mesma ordem. TRANSLATE()
por outro lado, substitui cada caractere um por um, independentemente da ordem desses caracteres. Exemplo – Mesmo resultado
Existem alguns casos em que ambas as funções retornarão o mesmo resultado. Assim:
SELECT REPLACE('123', '123', '456') AS Replace, TRANSLATE('123', '123', '456') AS Translate;
Resultado:
Replace Translate ------- --------- 456 456
Neste caso,
REPLACE()
retorna 456
porque a string exata no segundo argumento correspondia a uma string no primeiro argumento (neste caso, era a string inteira). TRANSLATE()
retorna 456
porque cada caractere no segundo argumento está presente no primeiro argumento. Exemplo – Resultado Diferente
Agora, para um exemplo que demonstra uma das diferenças entre
TRANSLATE()
e REPLACE()
:SELECT REPLACE('123', '321', '456') AS Replace, TRANSLATE('123', '321', '456') AS Translate;
Resultado:
Replace Translate ------- --------- 123 654
Neste caso,
REPLACE()
não tem efeito (retorna a string original) porque o segundo argumento não é uma correspondência exata para o primeiro argumento (ou uma substring dentro dele). Mesmo que o segundo argumento contenha os caracteres corretos, eles não estão na mesma ordem que o primeiro argumento e, portanto, a string inteira não corresponde. TRANSLATE()
faz têm efeito porque cada caractere no segundo argumento está presente no primeiro argumento. Não importa que estejam em uma ordem diferente, pois cada caractere é traduzido um por um. O SQL Server traduz o primeiro caractere, depois o segundo, depois o terceiro e assim por diante. Strings não contíguas
Semelhante ao exemplo anterior, você também pode obter resultados diferentes quando o primeiro argumento contém os caracteres do segundo argumento, mas eles não são contíguos:
SELECT REPLACE('1car23', '123', '456') AS Replace, TRANSLATE('1car23', '123', '456') AS Translate;
Resultado:
Replace Translate ------- --------- 1car23 4car56
Argumentos de tamanho diferente
Você também pode obter resultados diferentes entre cada função sempre que houver discrepâncias no número de caracteres nos vários argumentos.
Aqui está um exemplo em que o primeiro argumento contém menos caracteres do que o segundo e o terceiro argumentos:
SELECT REPLACE('123', '1234', '4567') AS Replace, TRANSLATE('123', '1234', '4567') AS Translate;
Resultado:
Replace Translate ------- --------- 123 456
Neste caso,
REPLACE()
não tem efeito porque o segundo argumento contém mais caracteres do que o primeiro argumento. Portanto, é impossível que o primeiro argumento contenha o segundo argumento. O
TRANSLATE()
função no entanto, tem um efeito neste caso. Isso ocorre porque o segundo argumento contém caracteres que estão no primeiro argumento. Não importa que o segundo argumento contenha mais caracteres que o primeiro. O mais importante é que o terceiro argumento contém o mesmo número de caracteres que o segundo. Há também casos em que
REPLACE()
funciona perfeitamente, mas TRANSLATE()
lança um erro. Exemplo:
SELECT REPLACE('1234', '123', '4567') AS Replace;
Resultado:
Replace ------- 45674
Neste caso,
REPLACE()
funciona como esperado. No entanto, se fornecermos os mesmos argumentos para
TRANSLATE()
, obtemos um erro: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 a mensagem de erro, o segundo e o terceiro argumentos devem conter um número igual de caracteres.
Quando devo usar REPLACE()?
Você deve usar
REPLACE()
quando você precisa substituir todas as ocorrências de uma string específica, exatamente como está escrita. Por exemplo, alterar o nome de alguém para outro nome. Usando
TRANSLATE()
nesses casos pode ter resultados desastrosos:SELECT REPLACE('Homer Simpson', 'Homer', 'Jason') AS Replace, TRANSLATE('Homer Simpson', 'Homer', 'Jason') AS Translate;
Resultado:
Replace Translate ------------- ------------- Jason Simpson Jason Sispsan
Quando devo usar TRANSLATE()?
Conforme demonstrado no exemplo anterior, o método
TRANSLATE()
A função pode ser útil se você precisar substituir todas as ocorrências de cada caractere especificado, independentemente de sua ordem na string original. Também pode ser usado no lugar de
REPLACE()
simplesmente o código. Aqui está um exemplo (com base em um exemplo no site da 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)