Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função TRANSLATE() no Oracle


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() substituiu a e t (cada personagem individual)
  • REPLACE() substituído at (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: