Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fonction TRANSLATE() dans Oracle

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 et t (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: