Vanaf SQL Server 2017 kunt u nu de T-SQL TRANSLATE()
gebruiken functie om een of meer tekens in een andere reeks tekens te vertalen.
Op het eerste gezicht zou je kunnen denken dat de TRANSLATE()
functie doet precies hetzelfde als de REPLACE()
functie, maar er zijn significante verschillen tussen de twee.
Definities
Laten we eerst eens kijken naar de definitie van elke functie:
REPLACE()
- Vervangt alle exemplaren van een opgegeven tekenreekswaarde door een andere tekenreekswaarde.
TRANSLATE()
- Retourneert de tekenreeks die als eerste argument is opgegeven nadat enkele tekens die in het tweede argument zijn opgegeven, zijn vertaald in een doelset tekens.
Het belangrijkste verschil is hoe elke functie omgaat met meerdere karakters. REPLACE()
vervangt een string door een andere string. Als een tekenreeks dus meerdere tekens bevat, moet elk teken in dezelfde volgorde staan. TRANSLATE()
aan de andere kant vervangt elk teken één voor één, ongeacht de volgorde van die tekens.
Voorbeeld – Zelfde resultaat
Er zijn enkele gevallen waarin beide functies hetzelfde resultaat opleveren. Zoals dit:
SELECT REPLACE('123', '123', '456') AS Replace, TRANSLATE('123', '123', '456') AS Translate;
Resultaat:
Replace Translate ------- --------- 456 456
In dit geval REPLACE()
retourneert 456
omdat de exacte string in het tweede argument overeenkwam met een string in het eerste argument (in dit geval was het de hele string).
TRANSLATE()
retourneert 456
omdat elk teken in het tweede argument aanwezig is in het eerste argument.
Voorbeeld – ander resultaat
Nu een voorbeeld dat een van de verschillen laat zien tussen TRANSLATE()
en REPLACE()
:
SELECT REPLACE('123', '321', '456') AS Replace, TRANSLATE('123', '321', '456') AS Translate;
Resultaat:
Replace Translate ------- --------- 123 654
In dit geval REPLACE()
heeft geen effect (het geeft de originele tekenreeks terug) omdat het tweede argument niet exact overeenkomt met het eerste argument (of een subtekenreeks daarbinnen). Ook al bevat het tweede argument de juiste karakters, ze staan niet in dezelfde volgorde als het eerste argument, en daarom komt de hele string niet overeen.
TRANSLATE()
doet effect hebben omdat elk teken in het tweede argument aanwezig is in het eerste argument. Het maakt niet uit dat ze in een andere volgorde staan, want elk teken wordt één voor één vertaald. SQL Server vertaalt het eerste teken, dan het tweede, dan het derde, enzovoort.
Niet-aaneengesloten strings
Net als in het vorige voorbeeld, kunt u ook andere resultaten krijgen als het eerste argument de tekens in het tweede argument bevat, maar niet aaneengesloten zijn:
SELECT REPLACE('1car23', '123', '456') AS Replace, TRANSLATE('1car23', '123', '456') AS Translate;
Resultaat:
Replace Translate ------- --------- 1car23 4car56
Argumenten van verschillende lengte
U kunt ook verschillende resultaten krijgen tussen elke functie wanneer er verschillen zijn in het aantal tekens in de verschillende argumenten.
Hier is een voorbeeld waarbij het eerste argument minder tekens bevat dan het tweede en derde argument:
SELECT REPLACE('123', '1234', '4567') AS Replace, TRANSLATE('123', '1234', '4567') AS Translate;
Resultaat:
Replace Translate ------- --------- 123 456
In dit geval REPLACE()
heeft geen effect omdat het tweede argument meer karakters bevat dan het eerste argument. Daarom is het onmogelijk dat het eerste argument het tweede argument bevat.
De TRANSLATE()
functie heeft in dit geval echter wel effect. Dit komt omdat het tweede argument tekens bevat die in het eerste argument voorkomen. Het maakt niet uit dat het tweede argument meer tekens bevat dan het eerste. Het belangrijkste is dat het derde argument hetzelfde aantal tekens bevat als het tweede.
Er zijn ook gevallen waarin REPLACE()
werkt perfect, maar TRANSLATE()
geeft een fout.
Voorbeeld:
SELECT REPLACE('1234', '123', '4567') AS Replace;
Resultaat:
Replace ------- 45674
In dit geval REPLACE()
werkt zoals verwacht.
Als we echter dezelfde argumenten geven aan TRANSLATE()
, krijgen we een foutmelding:
SELECT TRANSLATE('1234', '123', '4567') AS Translate;
Resultaat:
Error: The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters.
Zoals de foutmelding aangeeft, moeten het tweede en derde argument een gelijk aantal tekens bevatten.
Wanneer moet ik REPLACE() gebruiken?
Gebruik REPLACE()
wanneer u alle exemplaren van een specifieke tekenreeks moet vervangen, precies zoals deze is geschreven. Bijvoorbeeld iemands naam veranderen in een andere naam.
TRANSLATE()
gebruiken in dergelijke gevallen kan dit rampzalige gevolgen hebben:
SELECT REPLACE('Homer Simpson', 'Homer', 'Jason') AS Replace, TRANSLATE('Homer Simpson', 'Homer', 'Jason') AS Translate;
Resultaat:
Replace Translate ------------- ------------- Jason Simpson Jason Sispsan
Wanneer moet ik TRANSLATE() gebruiken?
Zoals aangetoond in het vorige voorbeeld, is de TRANSLATE()
functie kan handig zijn als u alle exemplaren van elk opgegeven teken moet vervangen, ongeacht hun volgorde binnen de oorspronkelijke tekenreeks.
Het kan ook worden gebruikt in plaats van REPLACE()
om gewoon de code. Hier is een voorbeeld (gebaseerd op een voorbeeld op de Microsoft-website):
SELECT REPLACE(REPLACE(REPLACE(REPLACE('2*[3+4]/{7-2}','[','('), ']', ')'), '{', '('), '}', ')') AS Replace, TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()') AS Translate;
Resultaat:
Replace Translate ------------- ------------- 2*(3+4)/(7-2) 2*(3+4)/(7-2)