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()
sostituitoat
et
(ogni singolo personaggio)REPLACE()
sostituitoat
(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: