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

Substituir vários caracteres em uma string no SQL Server (T-SQL)


No SQL Server, o REPLACE() A função nos permite substituir uma string por outra string. Mas e se você quiser substituir uma lista de caracteres por outra lista de caracteres?

O TRANSLATE() função pode ajudar.

Aqui está a explicação da Microsoft sobre o TRANSLATE() função:

Retorna a string fornecida como um primeiro argumento depois que alguns caracteres especificados no segundo argumento são convertidos em um conjunto de caracteres de destino especificado no terceiro argumento.

Claro como lama?

Exemplo


Eu acho que este é um daqueles momentos que realmente grita por um exemplo.
SELECT TRANSLATE('Fred [10 points]', '[]', '()');

Resultado:
Fred (10 points)

Basicamente, é como se tivéssemos fornecido uma lista de valores para substituir outra lista de valores. Mas não há necessidade de separar cada item da lista com um separador.

Número igual de caracteres


O segundo e terceiro argumentos devem conter um número igual de caracteres.

Em outras palavras, você não pode fazer isso:
SELECT TRANSLATE('Fred [10 points]', '[]', '(');

Resultado:
Msg 9828, Level 16, State 1, Line 1
The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters.

Nesse caso, o segundo argumento contém dois caracteres, mas o terceiro argumento contém apenas um, portanto, obtemos um erro.

Isso acontece porque o SQL Server precisa saber qual caractere deve substituir o segundo caractere do segundo argumento. Ele passa por cada caractere, um por um, substituindo-o pelo caractere correspondente do terceiro argumento. Se nenhum existir, ele não terá outra opção a não ser lançar um erro.

Comparado com REPLACE()


Aqui está um exemplo que ilustra a diferença entre TRANSLATE() e REPLACE() .
SELECT 
  REPLACE('[] [hey]', '[]', '()') AS REPLACE,
  TRANSLATE('[] [hey]', '[]', '()') AS TRANSLATE;

Resultado:
+-----------+-------------+
 | REPLACE   | TRANSLATE   |
 |-----------+-------------|
 | () [hey]  | () (hey)    |
 +-----------+-------------+ 

O REPLACE() função deixa [hey] exatamente como está, porque essa string inteira não foi fornecida no segundo argumento. Esta função só encontra uma correspondência se a string inteira estiver presente.

O TRANSLATE() a função, por outro lado, substitui [hey] com (hey) porque substitui cada caractere um por um. Não está procurando uma string inteira para substituir, está apenas procurando cada caractere individual individualmente.