Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server REPLACE() vs TRANSLATE():Quais são as diferenças?


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