In SQL Server, il REPLACE()
La funzione ci consente di sostituire una stringa con un'altra stringa. Ma cosa succede se si desidera sostituire un elenco di caratteri con un altro elenco di caratteri?
Il TRANSLATE()
la funzione potrebbe aiutare.
Ecco la spiegazione di Microsoft del TRANSLATE()
funzione:
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.
Chiaro come fango?
Esempio
Penso che questa sia una di quelle volte in cui si fa davvero un esempio.
SELECT TRANSLATE('Fred [10 points]', '[]', '()');
Risultato:
Fred (10 points)
Fondamentalmente, è come se avessimo fornito un elenco di valori per sostituire un altro elenco di valori. Ma non è necessario separare ogni elemento dell'elenco con un separatore.
Uguale numero di caratteri
Il secondo e il terzo argomento devono contenere un numero uguale di caratteri.
In altre parole, non puoi farlo:
SELECT TRANSLATE('Fred [10 points]', '[]', '(');
Risultato:
Msg 9828, Level 16, State 1, Line 1 The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters.
In questo caso il secondo argomento contiene due caratteri ma il terzo argomento ne contiene solo uno, quindi otteniamo un errore.
Ciò accade perché SQL Server deve sapere quale carattere deve sostituire il secondo carattere del secondo argomento. Passa attraverso ogni carattere, uno per uno, sostituendolo con il carattere corrispondente del terzo argomento. Se non ne esiste nessuno, non ha altra scelta che generare un errore.
Rispetto a REPLACE()
Ecco un esempio che illustra la differenza tra TRANSLATE()
e REPLACE()
.
SELECT
REPLACE('[] [hey]', '[]', '()') AS REPLACE,
TRANSLATE('[] [hey]', '[]', '()') AS TRANSLATE;
Risultato:
+-----------+-------------+ | REPLACE | TRANSLATE | |-----------+-------------| | () [hey] | () (hey) | +-----------+-------------+
Il REPLACE()
la funzione lascia [hey]
esattamente com'è, perché l'intera stringa non è stata fornita nel secondo argomento. Questa funzione trova una corrispondenza solo se è presente l'intera stringa.
Il TRANSLATE()
la funzione d'altra parte sostituisce [hey]
con (hey)
perché sostituisce ogni carattere uno per uno. Non sta cercando un'intera stringa da sostituire, sta solo cercando ogni singolo carattere individualmente.