Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Remplacer plusieurs caractères dans une chaîne dans SQL Server (T-SQL)

Dans SQL Server, le REPLACE() La fonction nous permet de remplacer une chaîne par une autre chaîne. Mais que se passe-t-il si vous souhaitez remplacer une liste de caractères par une autre liste de caractères ?

Le TRANSLATE() fonction pourrait aider.

Voici l'explication de Microsoft sur le TRANSLATE() fonction :

Renvoie la chaîne fournie en tant que premier argument après que certains caractères spécifiés dans le deuxième argument ont été traduits en un ensemble de caractères de destination spécifié dans le troisième argument.

Clair comme de la boue ?

Exemple

Je pense que c'est l'un de ces moments qui crie vraiment pour un exemple.

SELECT TRANSLATE('Fred [10 points]', '[]', '()');

Résultat :

Fred (10 points)

Fondamentalement, c'est comme si nous avions fourni une liste de valeurs pour remplacer une autre liste de valeurs. Mais il n'est pas nécessaire de séparer chaque élément de la liste avec un séparateur.

Nombre égal de caractères

Les deuxième et troisième arguments doivent contenir un nombre égal de caractères.

En d'autres termes, vous ne pouvez pas faire ceci :

SELECT TRANSLATE('Fred [10 points]', '[]', '(');

Résultat :

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.

Dans ce cas, le deuxième argument contient deux caractères mais le troisième argument n'en contient qu'un, nous obtenons donc une erreur.

Cela se produit car SQL Server doit savoir quel caractère doit remplacer le deuxième caractère du deuxième argument. Il parcourt chaque caractère, un par un, en le remplaçant par le caractère correspondant du troisième argument. S'il n'en existe pas, il n'a d'autre choix que de générer une erreur.

Comparé à REPLACE()

Voici un exemple qui illustre la différence entre TRANSLATE() et REPLACE() .

SELECT 
  REPLACE('[] [hey]', '[]', '()') AS REPLACE,
  TRANSLATE('[] [hey]', '[]', '()') AS TRANSLATE;

Résultat :

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

Le REPLACE() la fonction laisse [hey] exactement tel qu'il est, car toute cette chaîne n'a pas été fournie dans le deuxième argument. Cette fonction ne trouve une correspondance que si la chaîne entière est présente.

Le TRANSLATE() la fonction remplace par contre [hey] avec (hey) car il remplace chaque caractère un par un. Il ne recherche pas une chaîne entière à remplacer, il recherche uniquement chaque caractère individuellement.