Fra og med SQL Server 2017 kan du nu bruge T-SQL TRANSLATE()
funktion til at oversætte et eller flere tegn til et andet sæt tegn.
Ved første øjekast tror du måske, at TRANSLATE()
funktion gør nøjagtig det samme som REPLACE()
funktion, men der er betydelige forskelle mellem de to.
Definitioner
Lad os først se på definitionen af hver funktion:
REPLACE()
- Erstatter alle forekomster af en specificeret strengværdi med en anden strengværdi.
TRANSLATE()
- Returnerer strengen, der er angivet som et første argument, efter at nogle tegn, der er angivet i det andet argument, er oversat til et destinationssæt af tegn.
Den største forskel er, hvordan hver funktion håndterer flere tegn. REPLACE()
erstatter en streng med en anden streng. Derfor, hvis en streng indeholder flere tegn, skal hvert tegn være i samme rækkefølge. TRANSLATE()
på den anden side erstatter hvert tegn et efter et, uanset rækkefølgen af disse tegn.
Eksempel – Samme resultat
Der er nogle tilfælde, hvor begge funktioner vil returnere det samme resultat. Sådan:
SELECT REPLACE('123', '123', '456') AS Replace, TRANSLATE('123', '123', '456') AS Translate;
Resultat:
Replace Translate ------- --------- 456 456
I dette tilfælde REPLACE()
returnerer 456
fordi den nøjagtige streng i det andet argument matchede en streng i det første argument (i dette tilfælde var det hele strengen).
TRANSLATE()
returnerer 456
fordi hvert tegn i det andet argument er til stede i det første argument.
Eksempel – andet resultat
Nu til et eksempel, der viser en af forskellene mellem TRANSLATE()
og REPLACE()
:
SELECT REPLACE('123', '321', '456') AS Replace, TRANSLATE('123', '321', '456') AS Translate;
Resultat:
Replace Translate ------- --------- 123 654
I dette tilfælde REPLACE()
har ingen effekt (det returnerer den oprindelige streng), fordi det andet argument ikke er et nøjagtigt match for det første argument (eller en understreng i det). Selvom det andet argument indeholder de korrekte tegn, er de ikke i samme rækkefølge som det første argument, og derfor stemmer hele strengen ikke overens.
TRANSLATE()
gør have en effekt, fordi hvert tegn i det andet argument er til stede i det første argument. Det gør ikke noget, at de er i en anden rækkefølge, for hver karakter er oversat én efter én. SQL Server oversætter det første tegn, derefter det andet, så det tredje og så videre.
Ikke-sammenhængende strenge
I lighed med det foregående eksempel kan du også få andre resultater, når det første argument indeholder tegnene i det andet argument, men de er ikke sammenhængende:
SELECT REPLACE('1car23', '123', '456') AS Replace, TRANSLATE('1car23', '123', '456') AS Translate;
Resultat:
Replace Translate ------- --------- 1car23 4car56
Argumenter af forskellig længde
Du kan også få forskellige resultater mellem hver funktion, når der er uoverensstemmelser i antallet af tegn i de forskellige argumenter.
Her er et eksempel, hvor det første argument indeholder færre tegn end det andet og tredje argument:
SELECT REPLACE('123', '1234', '4567') AS Replace, TRANSLATE('123', '1234', '4567') AS Translate;
Resultat:
Replace Translate ------- --------- 123 456
I dette tilfælde REPLACE()
har ingen effekt, fordi det andet argument indeholder flere tegn end det første argument. Derfor er det umuligt for det første argument at indeholde det andet argument.
TRANSLATE()
funktion har dog en effekt i dette tilfælde. Dette skyldes, at det andet argument indeholder tegn, der er i det første argument. Det gør ikke noget, at det andet argument indeholder flere tegn end det første. Det vigtigste er, at det tredje argument indeholder det samme antal tegn som det andet.
Der er også tilfælde, hvor REPLACE()
fungerer perfekt, men TRANSLATE()
kaster en fejl.
Eksempel:
SELECT REPLACE('1234', '123', '4567') AS Replace;
Resultat:
Replace ------- 45674
I dette tilfælde REPLACE()
fungerer som forventet.
Men hvis vi giver de samme argumenter til TRANSLATE()
, får vi en fejl:
SELECT TRANSLATE('1234', '123', '4567') AS Translate;
Resultat:
Error: The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters.
Som fejlmeddelelsen angiver, skal andet og tredje argument indeholde lige mange tegn.
Hvornår skal jeg bruge REPLACE()?
Du skal bruge REPLACE()
når du skal erstatte alle forekomster af en bestemt streng, præcis som den er skrevet. For eksempel at ændre en persons navn til et andet navn.
Brug af TRANSLATE()
i sådanne tilfælde kan have katastrofale resultater:
SELECT REPLACE('Homer Simpson', 'Homer', 'Jason') AS Replace, TRANSLATE('Homer Simpson', 'Homer', 'Jason') AS Translate;
Resultat:
Replace Translate ------------- ------------- Jason Simpson Jason Sispsan
Hvornår skal jeg bruge TRANSLATE()?
Som vist i det foregående eksempel er TRANSLATE()
funktionen kan være nyttig, hvis du har brug for at erstatte alle forekomster af hvert angivet tegn, uanset deres rækkefølge inden for den originale streng.
Det kan også bruges i stedet for REPLACE()
til blot koden. Her er et eksempel (baseret på et eksempel på Microsofts websted):
SELECT REPLACE(REPLACE(REPLACE(REPLACE('2*[3+4]/{7-2}','[','('), ']', ')'), '{', '('), '}', ')') AS Replace, TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()') AS Translate;
Resultat:
Replace Translate ------------- ------------- 2*(3+4)/(7-2) 2*(3+4)/(7-2)