sql >> Database >  >> RDS >> Sqlserver

SQL Server REPLACE() vs TRANSLATE():wat zijn de verschillen?

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)


  1. PLSQL :NIEUW en :OUD

  2. Haal records op met de hoogste/kleinste <whatever> per groep

  3. Hoe ODP.NET 2.111 en ODP.NET 4.112 op dezelfde machine naast elkaar te installeren, terwijl beide naar dezelfde databaseserver verwijzen

  4. Problemen bij het importeren van een txt-bestand in postgres met php