sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server REPLACE() vs TRANSLATE():Hvad er forskellene?

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)


  1. Sådan genopbygger du en inkonsekvent PostgreSQL-slave

  2. Sådan formateres tal som romertal i Oracle

  3. Hvordan SID er forskellig fra tjenestenavn i Oracle tnsnames.ora

  4. Åbn automatisk SQLite-forespørgselsresultater i Excel