sql >> Base de Datos >  >> RDS >> Oracle

Función TRANSLATE() en Oracle

En Oracle, el TRANSLATE() La función le permite realizar varias sustituciones de un solo carácter, uno a uno, en una sola operación.

Devuelve la cadena proporcionada como primer argumento después de que algunos caracteres especificados en el segundo argumento se traducen a un conjunto de caracteres de destino especificado en el tercer argumento.

Es similar al REPLACE() función, excepto que el REPLACE() La función reemplaza la cadena completa con otra cadena (es decir, no carácter por carácter, como TRANSLATE() lo hace).

Sintaxis

La sintaxis es así:

TRANSLATE(expr, from_string, to_string)

La función devuelve expr con todas las apariciones de cada carácter en from_string reemplazado por su carácter correspondiente en to_string .

Ejemplo

He aquí un ejemplo básico:

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

Resultado:

Cow

Aquí, el a y t los caracteres fueron reemplazados con o y w .

En este caso, el REPLACE() La función habría producido el mismo resultado. Aquí están las dos funciones una al lado de la otra:

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

Resultado:

   TRANSLATE    REPLACE 
____________ __________ 
Cow          Cow       

En este caso, el resultado de ambas funciones es el mismo, pero por razones diferentes.

Esto es lo que hizo cada función:

  • TRANSLATE() reemplazado a y t (cada carácter individual)
  • REPLACE() reemplazado at (la cadena)

Orden mixto

Este ejemplo demuestra dónde TRANSLATE() difiere de REPLACE() . En este ejemplo, cambio el orden de los caracteres a reemplazar, así como los caracteres a reemplazar:

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

Resultado:

   TRANSLATE    REPLACE 
____________ __________ 
Cow          Cat       

En este caso solo el TRANSLATE() entró en vigor la función. Esto se debe a que esta función recorre cada carácter uno por uno. El REPLACE() Por otro lado, la función busca la cadena completa, exactamente en el mismo orden.

Un ejemplo más poderoso

Este ejemplo muestra un escenario donde TRANSLATE() La función tiene un beneficio significativo sobre el REPLACE() función:

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

Resultado:

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

Para obtener el resultado equivalente usando REPLACE() función, tendríamos que hacer esto:

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

Resultado:

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

El ejemplo anterior se basa en la documentación de Microsoft para T-SQL TRANSLATE() función, que es similar a la versión de Oracle.

Sin coincidencia

Si no hay coincidencias, TRANSLATE() devuelve la cadena sin cambios:

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

Resultado:

Cat

Sensibilidad de mayúsculas y minúsculas

El TRANSLATE() la función realiza una coincidencia que distingue entre mayúsculas y minúsculas:

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

Resultado:

Cat

En este ejemplo, el caso no coincidía, por lo que la cadena original se devolvió sin cambios.

Cadenas vacías

Esto es lo que sucede cuando se pasa una cadena vacía para cada argumento dado:

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

Resultado:

     R1      R2      R3 
_______ _______ _______ 
null    null    null   

De forma predeterminada, SQLcl y SQL*Plus devuelven un espacio en blanco cada vez que null ocurre como resultado de un SQL SELECT declaración.

Sin embargo, puede usar SET NULL para especificar una cadena diferente a devolver. Aquí especifiqué que la cadena null debe ser devuelto.

Carácter espacial

La cadena vacía no es lo mismo que el carácter de espacio.

Esto es lo que sucede cuando cambiamos la cadena vacía por un espacio:

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

Resultado:

   R1     R2    R3 
_____ ______ _____ 
C     Cat         

Aquí hay un ejemplo que ilustra cómo TRANSLATE() y REPLACE() devolver resultados diferentes al usar el carácter de espacio:

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

Resultado:

   TRANSLATE    REPLACE 
____________ __________ 
C            Cow       

Argumentos nulos

Pasando null para cualquier argumento devuelve 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;

Resultado:

      1       2       3 
_______ _______ _______ 
null    null    null   

Argumentos faltantes

Llamando a TRANSLATE() sin pasar ningún argumento da como resultado un error:

SELECT TRANSLATE()
FROM DUAL;

Resultado:

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:

Demasiados Argumentos

Y pasar demasiados argumentos devuelve un error:

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

Resultado:

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: