Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server REPLACE() vs. TRANSLATE():Was sind die Unterschiede?

Ab SQL Server 2017 können Sie jetzt T-SQL TRANSLATE() verwenden Funktion, um ein oder mehrere Zeichen in einen anderen Zeichensatz zu übersetzen.

Auf den ersten Blick könnte man meinen, dass die TRANSLATE() Funktion macht genau dasselbe wie die REPLACE() Funktion, aber es gibt signifikante Unterschiede zwischen den beiden.

Definitionen

Sehen wir uns zunächst die Definition jeder Funktion an:

REPLACE()
Ersetzt alle Vorkommen eines angegebenen Zeichenfolgenwerts durch einen anderen Zeichenfolgenwert.
TRANSLATE()
Gibt die als erstes Argument bereitgestellte Zeichenfolge zurück, nachdem einige im zweiten Argument angegebene Zeichen in einen Zielzeichensatz übersetzt wurden.

Der Hauptunterschied besteht darin, wie jede Funktion mit mehreren Zeichen umgeht. REPLACE() ersetzt eine Zeichenfolge durch eine andere Zeichenfolge. Wenn eine Zeichenfolge mehrere Zeichen enthält, müssen sich daher alle Zeichen in derselben Reihenfolge befinden. TRANSLATE() ersetzt andererseits jedes Zeichen einzeln, unabhängig von der Reihenfolge dieser Zeichen.

Beispiel – Gleiches Ergebnis

Es gibt einige Fälle, in denen beide Funktionen dasselbe Ergebnis zurückgeben. So:

SELECT 
    REPLACE('123', '123', '456') AS Replace,
    TRANSLATE('123', '123', '456') AS Translate;

Ergebnis:

Replace  Translate
-------  ---------
456      456      

In diesem Fall REPLACE() gibt 456 zurück weil die exakte Zeichenfolge im zweiten Argument mit einer Zeichenfolge im ersten Argument übereinstimmte (in diesem Fall war es die gesamte Zeichenfolge).

TRANSLATE() gibt 456 zurück weil jedes Zeichen im zweiten Argument im ersten Argument vorhanden ist.

Beispiel – Unterschiedliches Ergebnis

Nun zu einem Beispiel, das einen der Unterschiede zwischen TRANSLATE() demonstriert und REPLACE() :

SELECT 
    REPLACE('123', '321', '456') AS Replace,
    TRANSLATE('123', '321', '456') AS Translate;

Ergebnis:

Replace  Translate
-------  ---------
123      654      

In diesem Fall REPLACE() hat keine Auswirkung (es gibt die ursprüngliche Zeichenfolge zurück), da das zweite Argument keine exakte Übereinstimmung mit dem ersten Argument (oder einer darin enthaltenen Teilzeichenfolge) ist. Obwohl das zweite Argument die richtigen Zeichen enthält, befinden sie sich nicht in derselben Reihenfolge wie das erste Argument, und daher stimmt die gesamte Zeichenfolge nicht überein.

TRANSLATE() macht wirken sich aus, da jedes Zeichen im zweiten Argument im ersten Argument vorhanden ist. Es spielt keine Rolle, dass sie in einer anderen Reihenfolge sind, da jedes Zeichen einzeln übersetzt wird. SQL Server übersetzt das erste Zeichen, dann das zweite, dann das dritte und so weiter.

Nicht zusammenhängende Zeichenfolgen

Ähnlich wie im vorherigen Beispiel können Sie auch unterschiedliche Ergebnisse erhalten, wenn das erste Argument die Zeichen des zweiten Arguments enthält, diese jedoch nicht zusammenhängend sind:

SELECT 
    REPLACE('1car23', '123', '456') AS Replace,
    TRANSLATE('1car23', '123', '456') AS Translate;

Ergebnis:

Replace  Translate
-------  ---------
1car23   4car56   

Argumente unterschiedlicher Länge

Sie können auch unterschiedliche Ergebnisse zwischen den einzelnen Funktionen erhalten, wenn es Diskrepanzen in der Anzahl der Zeichen in den verschiedenen Argumenten gibt.

Hier ist ein Beispiel, bei dem das erste Argument weniger Zeichen enthält als das zweite und dritte Argument:

SELECT 
    REPLACE('123', '1234', '4567') AS Replace,
    TRANSLATE('123', '1234', '4567') AS Translate;

Ergebnis:

Replace  Translate
-------  ---------
123      456      

In diesem Fall REPLACE() hat keine Auswirkung, da das zweite Argument mehr Zeichen enthält als das erste Argument. Daher ist es unmöglich, dass das erste Argument das zweite Argument enthält.

Das TRANSLATE() Funktion wirkt sich in diesem Fall jedoch aus. Dies liegt daran, dass das zweite Argument Zeichen enthält, die im ersten Argument enthalten sind. Es spielt keine Rolle, dass das zweite Argument mehr Zeichen enthält als das erste. Das Wichtigste ist, dass das dritte Argument die gleiche Anzahl von Zeichen enthält wie das zweite.

Es gibt auch Fälle, in denen REPLACE() funktioniert einwandfrei, aber TRANSLATE() wirft einen Fehler.

Beispiel:

SELECT REPLACE('1234', '123', '4567') AS Replace;

Ergebnis:

Replace
-------
45674  

In diesem Fall REPLACE() funktioniert wie erwartet.

Wenn wir jedoch dieselben Argumente für TRANSLATE() bereitstellen , erhalten wir einen Fehler:

SELECT TRANSLATE('1234', '123', '4567') AS Translate;

Ergebnis:

Error: The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters. 

Wie in der Fehlermeldung angegeben, müssen das zweite und das dritte Argument die gleiche Anzahl von Zeichen enthalten.

Wann sollte ich REPLACE() verwenden?

Sie sollten REPLACE() verwenden wenn Sie alle Vorkommen einer bestimmten Zeichenfolge genau so ersetzen müssen, wie sie geschrieben ist. Zum Beispiel den Namen einer Person in einen anderen Namen ändern.

Verwenden von TRANSLATE() kann in solchen Fällen verheerende Folgen haben:

SELECT 
    REPLACE('Homer Simpson', 'Homer', 'Jason') AS Replace,
    TRANSLATE('Homer Simpson', 'Homer', 'Jason') AS Translate;

Ergebnis:

Replace        Translate    
-------------  -------------
Jason Simpson  Jason Sispsan

Wann sollte ich TRANSLATE() verwenden?

Wie im vorherigen Beispiel demonstriert, ist TRANSLATE() Funktion kann nützlich sein, wenn Sie alle Vorkommen jedes angegebenen Zeichens ersetzen müssen, unabhängig von ihrer Reihenfolge innerhalb der ursprünglichen Zeichenfolge.

Es kann auch anstelle von REPLACE() verwendet werden einfach den Code. Hier ist ein Beispiel (basierend auf einem Beispiel auf der Microsoft-Website):

SELECT 
    REPLACE(REPLACE(REPLACE(REPLACE('2*[3+4]/{7-2}','[','('), ']', ')'), '{', '('), '}', ')') AS Replace,
    TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()') AS Translate;

Ergebnis:

Replace        Translate    
-------------  -------------
2*(3+4)/(7-2)  2*(3+4)/(7-2)