Dans Oracle, le TRANSLATE()
La fonction vous permet d'effectuer plusieurs substitutions d'un seul caractère en une seule opération.
Il renvoie la chaîne fournie en tant que premier argument après que certains caractères spécifiés dans le deuxième argument ont été traduits en un ensemble de caractères de destination spécifié dans le troisième argument.
C'est similaire au REPLACE()
fonction, sauf que la fonction REPLACE()
la fonction remplace la chaîne entière par une autre chaîne (c'est-à-dire pas caractère par caractère, comme TRANSLATE()
fait).
Syntaxe
La syntaxe ressemble à ceci :
TRANSLATE(expr, from_string, to_string)
La fonction renvoie expr
avec toutes les occurrences de chaque caractère dans from_string
remplacé par son caractère correspondant dans to_string
.
Exemple
Voici un exemple de base :
SELECT
TRANSLATE('Cat', 'at', 'ow')
FROM DUAL;
Résultat :
Cow
Ici, le a
et t
les caractères ont été remplacés par o
et w
.
Dans ce cas, le REPLACE()
fonction aurait produit le même résultat. Voici les deux fonctions côte à côte :
SELECT
TRANSLATE('Cat', 'at', 'ow') AS "TRANSLATE",
REPLACE('Cat', 'at', 'ow') AS "REPLACE"
FROM DUAL;
Résultat :
TRANSLATE REPLACE ____________ __________ Cow Cow
Dans ce cas, le résultat pour les deux fonctions est le même, mais pour des raisons différentes.
Voici ce que faisait chaque fonction :
TRANSLATE()
remplacéa
ett
(chaque caractère individuel)REPLACE()
remplacéat
(la chaîne)
Ordre mixte
Cet exemple montre où TRANSLATE()
diffère de REPLACE()
. Dans cet exemple, je change l'ordre des caractères à remplacer, ainsi que les caractères pour les remplacer :
SELECT
TRANSLATE('Cat', 'ta', 'wo') AS "TRANSLATE",
REPLACE('Cat', 'ta', 'wo') AS "REPLACE"
FROM DUAL;
Résultat :
TRANSLATE REPLACE ____________ __________ Cow Cat
Dans ce cas, seul le TRANSLATE()
fonction a pris effet. C'est parce que cette fonction parcourt chaque caractère un par un. Le REPLACE()
d'autre part, recherche la chaîne entière, exactement dans le même ordre.
Un exemple plus puissant
Cet exemple illustre un scénario où le TRANSLATE()
la fonction a un avantage significatif sur le REPLACE()
fonction :
SELECT
TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()')
FROM DUAL;
Résultat :
2*(3+4)/(7-2)
Pour obtenir le résultat équivalent en utilisant le REPLACE()
fonction, nous aurions besoin de faire ceci :
SELECT
REPLACE
(
REPLACE
(
REPLACE
(
REPLACE
(
'2*[3+4]/{7-2}',
'[',
'('
),
']',
')'
),
'{',
'('
),
'}',
')'
)
FROM DUAL;
Résultat :
2*(3+4)/(7-2)
L'exemple ci-dessus est basé sur la documentation Microsoft pour le T-SQL TRANSLATE()
fonction, qui est similaire à la version Oracle.
Aucune correspondance
S'il n'y a pas de correspondance, TRANSLATE()
renvoie la chaîne inchangée :
SELECT
TRANSLATE('Cat', 'x', 'y')
FROM DUAL;
Résultat :
Cat
Sensibilité à la casse
Le TRANSLATE()
la fonction effectue une correspondance sensible à la casse :
SELECT
TRANSLATE('Cat', 'AT', 'ow')
FROM DUAL;
Résultat :
Cat
Dans cet exemple, la casse ne correspondait pas et la chaîne d'origine a donc été retournée inchangée.
Chaînes vides
Voici ce qui se passe lorsqu'une chaîne vide est passée pour chaque argument donné :
SET NULL 'null';
SELECT
TRANSLATE('Cat', 'at', '') AS r1,
TRANSLATE('Cat', '', 'ow') AS r2,
TRANSLATE('', 'at', 'ow') AS r3
FROM DUAL;
Résultat :
R1 R2 R3 _______ _______ _______ null null null
Par défaut, SQLcl et SQL*Plus renvoient un espace vide chaque fois que null
se produit à la suite d'un SQL SELECT
déclaration.
Cependant, vous pouvez utiliser SET NULL
pour spécifier une autre chaîne à renvoyer. Ici, j'ai précisé que la chaîne null
doit être retourné.
Caractère espace
La chaîne vide n'est pas la même que le caractère espace.
Voici ce qui se passe lorsque nous changeons la chaîne vide en espace :
SELECT
TRANSLATE('Cat', 'at', ' ') AS r1,
TRANSLATE('Cat', ' ', 'ow') AS r2,
TRANSLATE(' ', 'at', 'ow') AS r3
FROM DUAL;
Résultat :
R1 R2 R3 _____ ______ _____ C Cat
Voici un exemple qui illustre comment TRANSLATE()
et REPLACE()
renvoie des résultats différents lors de l'utilisation du caractère espace :
SELECT
TRANSLATE(' ', ' ', 'Cow') AS TRANSLATE,
REPLACE(' ', ' ', 'Cow') AS REPLACE
FROM DUAL;
Résultat :
TRANSLATE REPLACE ____________ __________ C Cow
Arguments nuls
Passer null
pour tout argument renvoie 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;
Résultat :
1 2 3 _______ _______ _______ null null null
Arguments manquants
Appel de TRANSLATE()
sans passer d'arguments entraîne une erreur :
SELECT TRANSLATE()
FROM DUAL;
Résultat :
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:
Trop d'arguments
Et passer trop d'arguments renvoie une erreur :
SELECT TRANSLATE('Cat', 'a', 'b', 'c')
FROM DUAL;
Résultat :
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: