Oracle
 sql >> Datenbank >  >> RDS >> Oracle

TRANSLATE()-Funktion in Oracle

In Oracle das TRANSLATE() Mit dieser Funktion können Sie mehrere einzelne Zeichen eins zu eins in einem Vorgang ersetzen.

Es gibt die als erstes Argument bereitgestellte Zeichenfolge zurück, nachdem einige im zweiten Argument angegebene Zeichen in einen im dritten Argument angegebenen Zielsatz von Zeichen übersetzt wurden.

Es ähnelt dem REPLACE() Funktion, außer dass REPLACE() Funktion ersetzt den gesamten String durch einen anderen String (d.h. nicht zeichenweise, wie TRANSLATE() tut).

Syntax

Die Syntax lautet wie folgt:

TRANSLATE(expr, from_string, to_string)

Die Funktion gibt expr zurück mit allen Vorkommen jedes Zeichens in from_string durch das entsprechende Zeichen in to_string ersetzt .

Beispiel

Hier ist ein einfaches Beispiel:

SELECT 
    TRANSLATE('Cat', 'at', 'ow')
FROM DUAL;

Ergebnis:

Cow

Hier der a und t Zeichen wurden durch o ersetzt und w .

In diesem Fall das REPLACE() Die Funktion hätte das gleiche Ergebnis geliefert. Hier sind die beiden Funktionen nebeneinander:

SELECT 
  TRANSLATE('Cat', 'at', 'ow') AS "TRANSLATE",
  REPLACE('Cat', 'at', 'ow') AS "REPLACE"
FROM DUAL;

Ergebnis:

   TRANSLATE    REPLACE 
____________ __________ 
Cow          Cow       

In diesem Fall ist das Ergebnis für beide Funktionen gleich, aber aus unterschiedlichen Gründen.

Hier ist, was jede Funktion gemacht hat:

  • TRANSLATE() ersetzt a und t (jedes einzelne Zeichen)
  • REPLACE() ersetzt at (die Zeichenkette)

Gemischte Bestellung

Dieses Beispiel zeigt, wo TRANSLATE() unterscheidet sich von REPLACE() . In diesem Beispiel ändere ich die Reihenfolge der zu ersetzenden Zeichen sowie die Zeichen, die sie ersetzen sollen:

SELECT 
  TRANSLATE('Cat', 'ta', 'wo') AS "TRANSLATE",
  REPLACE('Cat', 'ta', 'wo') AS "REPLACE"
FROM DUAL;

Ergebnis:

   TRANSLATE    REPLACE 
____________ __________ 
Cow          Cat       

In diesem Fall nur das TRANSLATE() Funktion wirksam wurde. Dies liegt daran, dass diese Funktion jedes Zeichen einzeln durchgeht. Das REPLACE() Die Funktion hingegen sucht nach der gesamten Zeichenfolge in genau derselben Reihenfolge.

Ein leistungsfähigeres Beispiel

Dieses Beispiel zeigt ein Szenario, in dem TRANSLATE() Funktion hat einen erheblichen Vorteil gegenüber REPLACE() Funktion:

SELECT 
    TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()')
FROM DUAL;

Ergebnis:

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

Um das entsprechende Ergebnis zu erhalten, verwenden Sie REPLACE() -Funktion müssen wir Folgendes tun:

SELECT
REPLACE
(
      REPLACE
      (
            REPLACE
            (
                  REPLACE
                  (
                        '2*[3+4]/{7-2}',
                        '[',
                        '('
                  ),
                  ']',
                  ')'
            ),
            '{',
            '('
      ),
      '}',
      ')'
)
FROM DUAL;

Ergebnis:

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

Das obige Beispiel basiert auf der Microsoft-Dokumentation für T-SQL TRANSLATE() Funktion, die der Oracle-Version ähnlich ist.

Keine Übereinstimmung

Wenn es keine Übereinstimmungen gibt, TRANSLATE() gibt den String unverändert zurück:

SELECT 
  TRANSLATE('Cat', 'x', 'y')
FROM DUAL;

Ergebnis:

Cat

Groß-/Kleinschreibung

Das TRANSLATE() Funktion führt einen Vergleich zwischen Groß- und Kleinschreibung durch:

SELECT 
  TRANSLATE('Cat', 'AT', 'ow')
FROM DUAL;

Ergebnis:

Cat

In diesem Beispiel stimmte die Groß-/Kleinschreibung nicht, und daher wurde die ursprüngliche Zeichenfolge unverändert zurückgegeben.

Leere Zeichenfolgen

Folgendes passiert, wenn für jedes angegebene Argument eine leere Zeichenfolge übergeben wird:

SET NULL 'null';
SELECT 
  TRANSLATE('Cat', 'at', '') AS r1,
  TRANSLATE('Cat', '', 'ow') AS r2,
  TRANSLATE('', 'at', 'ow') AS r3
FROM DUAL;

Ergebnis:

     R1      R2      R3 
_______ _______ _______ 
null    null    null   

Standardmäßig geben SQLcl und SQL*Plus ein Leerzeichen zurück, wenn null tritt als Ergebnis eines SQL SELECT auf Erklärung.

Sie können jedoch SET NULL verwenden um eine andere Zeichenfolge anzugeben, die zurückgegeben werden soll. Hier habe ich angegeben, dass der String null zurückgegeben werden soll.

Leerzeichen

Die leere Zeichenfolge ist nicht dasselbe wie das Leerzeichen.

Folgendes passiert, wenn wir die leere Zeichenfolge in ein Leerzeichen ändern:

SELECT 
  TRANSLATE('Cat', 'at', ' ') AS r1,
  TRANSLATE('Cat', ' ', 'ow') AS r2,
  TRANSLATE(' ', 'at', 'ow') AS r3
FROM DUAL;

Ergebnis:

   R1     R2    R3 
_____ ______ _____ 
C     Cat         

Hier ist ein Beispiel, das veranschaulicht, wie TRANSLATE() und REPLACE() gibt unterschiedliche Ergebnisse zurück, wenn das Leerzeichen verwendet wird:

SELECT 
    TRANSLATE(' ', ' ', 'Cow') AS TRANSLATE,
    REPLACE(' ', ' ', 'Cow') AS REPLACE
FROM DUAL; 

Ergebnis:

   TRANSLATE    REPLACE 
____________ __________ 
C            Cow       

Null-Argumente

Übergabe von null für jedes Argument gibt null zurück :

SET NULL 'null';
SELECT 
    TRANSLATE(null, 'dog', 'cat') AS "1",
    TRANSLATE('Black dog', null, 'cat') AS "2",
    TRANSLATE('Black dog', 'dog', null) AS "3"
FROM DUAL;

Ergebnis:

      1       2       3 
_______ _______ _______ 
null    null    null   

Fehlende Argumente

Aufruf von TRANSLATE() ohne Argumente zu übergeben führt zu einem Fehler:

SELECT TRANSLATE()
FROM DUAL;

Ergebnis:

Error starting at line : 1 in command -
SELECT TRANSLATE()
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"
*Cause:    
*Action:

Zu viele Argumente

Und das Übergeben zu vieler Argumente gibt einen Fehler zurück:

SELECT TRANSLATE('Cat', 'a', 'b', 'c')
FROM DUAL;

Ergebnis:

Error starting at line : 1 in command -
SELECT TRANSLATE('Cat', 'a', 'b', 'c')
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00909: invalid number of arguments
00909. 00000 -  "invalid number of arguments"
*Cause:    
*Action: