No Oracle, o
TRANSLATE()
A função permite que você faça várias substituições um para um de caractere único em uma operação. Ele retorna a string fornecida como um primeiro argumento depois que alguns caracteres especificados no segundo argumento são convertidos em um conjunto de caracteres de destino especificado no terceiro argumento.
É semelhante ao
REPLACE()
função, exceto que a função REPLACE()
A função substitui a string inteira por outra string (ou seja, não caractere por caractere, como TRANSLATE()
faz). Sintaxe
A sintaxe fica assim:
TRANSLATE(expr, from_string, to_string)
A função retorna
expr
com todas as ocorrências de cada caractere em from_string
substituído por seu caractere correspondente em to_string
. Exemplo
Segue um exemplo básico:
SELECT
TRANSLATE('Cat', 'at', 'ow')
FROM DUAL;
Resultado:
Cow
Aqui, o
a
e t
os caracteres foram substituídos por o
e w
. Neste caso, o
REPLACE()
função teria produzido o mesmo resultado. Aqui estão as duas funções lado a lado:SELECT
TRANSLATE('Cat', 'at', 'ow') AS "TRANSLATE",
REPLACE('Cat', 'at', 'ow') AS "REPLACE"
FROM DUAL;
Resultado:
TRANSLATE REPLACE ____________ __________ Cow Cow
Nesse caso, o resultado para ambas as funções é o mesmo, mas por motivos diferentes.
Veja o que cada função fez:
TRANSLATE()
substituiua
et
(cada personagem individual)REPLACE()
substituídoat
(a cadeia)
Pedido Misto
Este exemplo demonstra onde
TRANSLATE()
difere de REPLACE()
. Neste exemplo, altero a ordem dos caracteres a serem substituídos, bem como os caracteres a serem substituídos:SELECT
TRANSLATE('Cat', 'ta', 'wo') AS "TRANSLATE",
REPLACE('Cat', 'ta', 'wo') AS "REPLACE"
FROM DUAL;
Resultado:
TRANSLATE REPLACE ____________ __________ Cow Cat
Neste caso apenas o
TRANSLATE()
função entrou em vigor. Isso ocorre porque essa função passa por cada caractere um por um. O REPLACE()
A função, por outro lado, procura a string inteira, exatamente na mesma ordem. Um exemplo mais poderoso
Este exemplo demonstra um cenário em que o
TRANSLATE()
função tem um benefício significativo sobre o REPLACE()
função:SELECT
TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()')
FROM DUAL;
Resultado:
2*(3+4)/(7-2)
Para obter o resultado equivalente usando o
REPLACE()
função, precisaríamos fazer isso:SELECT
REPLACE
(
REPLACE
(
REPLACE
(
REPLACE
(
'2*[3+4]/{7-2}',
'[',
'('
),
']',
')'
),
'{',
'('
),
'}',
')'
)
FROM DUAL;
Resultado:
2*(3+4)/(7-2)
O exemplo acima é baseado na documentação da Microsoft para o T-SQL
TRANSLATE()
função, que é semelhante à versão do Oracle. Sem correspondência
Se não houver correspondências,
TRANSLATE()
retorna a string inalterada:SELECT
TRANSLATE('Cat', 'x', 'y')
FROM DUAL;
Resultado:
Cat
Sensibilidade de maiúsculas e minúsculas
O
TRANSLATE()
função executa uma correspondência com distinção entre maiúsculas e minúsculas:SELECT
TRANSLATE('Cat', 'AT', 'ow')
FROM DUAL;
Resultado:
Cat
Neste exemplo, o caso não correspondeu e, portanto, a string original foi retornada inalterada.
Strings vazias
Aqui está o que acontece quando uma string vazia é passada 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
Por padrão, SQLcl e SQL*Plus retornam um espaço em branco sempre que
null
ocorre como resultado de um SQL SELECT
demonstração. No entanto, você pode usar
SET NULL
para especificar uma string diferente a ser retornada. Aqui eu especifiquei que a string null
deve ser devolvido. Caráter Espacial
A string vazia não é igual ao caractere de espaço.
Aqui está o que acontece quando alteramos a string vazia para um espaço:
SELECT
TRANSLATE('Cat', 'at', ' ') AS r1,
TRANSLATE('Cat', ' ', 'ow') AS r2,
TRANSLATE(' ', 'at', 'ow') AS r3
FROM DUAL;
Resultado:
R1 R2 R3 _____ ______ _____ C Cat
Aqui está um exemplo que ilustra como
TRANSLATE()
e REPLACE()
retornar resultados diferentes ao usar o caractere de espaço:SELECT
TRANSLATE(' ', ' ', 'Cow') AS TRANSLATE,
REPLACE(' ', ' ', 'Cow') AS REPLACE
FROM DUAL;
Resultado:
TRANSLATE REPLACE ____________ __________ C Cow
Argumentos nulos
Passando
null
para qualquer argumento retorna 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 ausentes
Chamando
TRANSLATE()
sem passar nenhum argumento resulta em um erro: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:
Muitos argumentos
E passar muitos argumentos retorna um erro:
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: