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()
reemplazadoa
yt
(cada carácter individual)REPLACE()
reemplazadoat
(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: