Oracle
 sql >> Database >  >> RDS >> Oracle

TRANSLATE() Funzione in Oracle

In Oracle, il TRANSLATE() La funzione consente di effettuare più sostituzioni uno a uno di un carattere in un'unica operazione.

Restituisce la stringa fornita come primo argomento dopo che alcuni caratteri specificati nel secondo argomento sono stati tradotti in un insieme di caratteri di destinazione specificato nel terzo argomento.

È simile a REPLACE() funzione, tranne per il REPLACE() la funzione sostituisce l'intera stringa con un'altra stringa (cioè non carattere per carattere, come TRANSLATE() fa).

Sintassi

La sintassi è questa:

TRANSLATE(expr, from_string, to_string)

La funzione restituisce expr con tutte le occorrenze di ogni carattere in from_string sostituito dal carattere corrispondente in to_string .

Esempio

Ecco un esempio di base:

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

Risultato:

Cow

Qui, il at e t i caratteri sono stati sostituiti con o e w .

In questo caso, il REPLACE() funzione avrebbe prodotto lo stesso risultato. Ecco le due funzioni affiancate:

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

Risultato:

   TRANSLATE    REPLACE 
____________ __________ 
Cow          Cow       

In questo caso, il risultato per entrambe le funzioni è lo stesso, ma per ragioni diverse.

Ecco cosa faceva ciascuna funzione:

  • TRANSLATE() sostituito at e t (ogni singolo personaggio)
  • REPLACE() sostituito at (la stringa)

Ordine misto

Questo esempio mostra dove TRANSLATE() differisce da REPLACE() . In questo esempio, cambio l'ordine dei caratteri da sostituire, così come i caratteri per sostituirli:

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

Risultato:

   TRANSLATE    REPLACE 
____________ __________ 
Cow          Cat       

In questo caso solo il TRANSLATE() funzione è entrata in vigore. Questo perché questa funzione passa attraverso ogni carattere uno per uno. Il REPLACE() funzione d'altra parte, cerca l'intera stringa, esattamente nello stesso ordine.

Un esempio più potente

Questo esempio mostra uno scenario in cui TRANSLATE() ha un vantaggio significativo rispetto a REPLACE() funzione:

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

Risultato:

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

Per ottenere il risultato equivalente utilizzando REPLACE() funzione, dovremmo farlo:

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

Risultato:

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

L'esempio precedente si basa sulla documentazione Microsoft per il TRANSLATE() di T-SQL funzione, che è simile alla versione Oracle.

Nessuna corrispondenza

Se non ci sono corrispondenze, TRANSLATE() restituisce la stringa invariata:

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

Risultato:

Cat

Maiuscole/minuscole

Il TRANSLATE() la funzione esegue una corrispondenza con distinzione tra maiuscole e minuscole:

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

Risultato:

Cat

In questo esempio, il caso non corrispondeva, quindi la stringa originale è stata restituita invariata.

Stringhe vuote

Ecco cosa succede quando viene passata una stringa vuota per ogni dato argomento:

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

Risultato:

     R1      R2      R3 
_______ _______ _______ 
null    null    null   

Per impostazione predefinita, SQLcl e SQL*Plus restituiscono uno spazio vuoto ogni volta che null si verifica come risultato di un SQL SELECT dichiarazione.

Tuttavia, puoi utilizzare SET NULL per specificare una stringa diversa da restituire. Qui ho specificato che la stringa null deve essere restituito.

Carattere spaziale

La stringa vuota non è la stessa del carattere spazio.

Ecco cosa succede quando cambiamo la stringa vuota in uno spazio:

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

Risultato:

   R1     R2    R3 
_____ ______ _____ 
C     Cat         

Ecco un esempio che illustra come TRANSLATE() e REPLACE() restituisce risultati diversi quando si utilizza il carattere spazio:

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

Risultato:

   TRANSLATE    REPLACE 
____________ __________ 
C            Cow       

Argomenti nulli

Passaggio null per qualsiasi argomento restituisce null :

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;

Risultato:

      1       2       3 
_______ _______ _______ 
null    null    null   

Argomenti mancanti

Chiamando TRANSLATE() senza passare alcun argomento genera un errore:

SELECT TRANSLATE()
FROM DUAL;

Risultato:

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:

Troppi argomenti

E passare troppi argomenti restituisce un errore:

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

Risultato:

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: