sql >> Databáze >  >> RDS >> Oracle

Funkce TRANSLATE() v Oracle

V Oracle je to TRANSLATE() Tato funkce umožňuje provést několik jednoznakových substitucí jedna ku jedné v jedné operaci.

Vrací řetězec zadaný jako první argument poté, co jsou některé znaky zadané ve druhém argumentu přeloženy do cílové sady znaků zadaných ve třetím argumentu.

Je to podobné jako REPLACE() funkce, kromě toho REPLACE() funkce nahradí celý řetězec jiným řetězcem (tj. ne znak po znaku, jako TRANSLATE() ano).

Syntaxe

Syntaxe vypadá takto:

TRANSLATE(expr, from_string, to_string)

Funkce vrací expr se všemi výskyty každého znaku v from_string nahrazen odpovídajícím znakem v to_string .

Příklad

Zde je základní příklad:

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

Výsledek:

Cow

Zde je a a t znaky byly nahrazeny o a w .

V tomto případě REPLACE() funkce by přinesla stejný výsledek. Zde jsou dvě funkce vedle sebe:

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

Výsledek:

   TRANSLATE    REPLACE 
____________ __________ 
Cow          Cow       

V tomto případě je výsledek pro obě funkce stejný, ale z různých důvodů.

Zde je to, co jednotlivé funkce dělaly:

  • TRANSLATE() nahradil a a t (každý jednotlivý znak)
  • REPLACE() nahrazeno at (řetězec)

Smíšené pořadí

Tento příklad ukazuje, kde je TRANSLATE() se liší od REPLACE() . V tomto příkladu změním pořadí znaků, které mají být nahrazeny, a také znaků, které je mají nahradit:

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

Výsledek:

   TRANSLATE    REPLACE 
____________ __________ 
Cow          Cat       

V tomto případě pouze TRANSLATE() funkce vstoupila v platnost. Tato funkce totiž prochází každý znak jeden po druhém. REPLACE() Funkce na druhé straně hledá celý řetězec v přesně stejném pořadí.

Výkonnější příklad

Tento příklad ukazuje scénář, kde je TRANSLATE() funkce má významnou výhodu oproti REPLACE() funkce:

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

Výsledek:

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

Chcete-li získat ekvivalentní výsledek pomocí REPLACE() funkci, musíme provést toto:

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

Výsledek:

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

Výše uvedený příklad je založen na dokumentaci společnosti Microsoft pro T-SQL TRANSLATE() funkce, která je podobná verzi Oracle.

Žádná shoda

Pokud neexistují žádné shody, TRANSLATE() vrátí řetězec beze změny:

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

Výsledek:

Cat

Rozlišovat malá a velká písmena

TRANSLATE() funkce provádí shodu rozlišující malá a velká písmena:

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

Výsledek:

Cat

V tomto příkladu se velká a malá písmena neshodovala, a tak byl původní řetězec vrácen beze změny.

Prázdné řetězce

Co se stane, když je pro každý daný argument předán prázdný řetězec:

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

Výsledek:

     R1      R2      R3 
_______ _______ _______ 
null    null    null   

Ve výchozím nastavení vrátí SQLcl a SQL*Plus prázdné místo vždy, když null dochází v důsledku SQL SELECT prohlášení.

Můžete však použít SET NULL určit jiný řetězec, který má být vrácen. Zde jsem uvedl, že řetězec null by měl být vrácen.

Mezerní znak

Prázdný řetězec není totéž jako znak mezery.

Zde je to, co se stane, když změníme prázdný řetězec na mezeru:

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

Výsledek:

   R1     R2    R3 
_____ ______ _____ 
C     Cat         

Zde je příklad, který ilustruje, jak TRANSLATE() a REPLACE() vrátit jiné výsledky při použití znaku mezery:

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

Výsledek:

   TRANSLATE    REPLACE 
____________ __________ 
C            Cow       

Nulové argumenty

Předávání null pro jakýkoli argument vrací 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;

Výsledek:

      1       2       3 
_______ _______ _______ 
null    null    null   

Chybí argumenty

Volání TRANSLATE() bez předání jakýchkoli argumentů dojde k chybě:

SELECT TRANSLATE()
FROM DUAL;

Výsledek:

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:

Příliš mnoho argumentů

A předání příliš mnoha argumentů vrátí chybu:

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

Výsledek:

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:

  1. Ovladače Easysoft ODBC a knihovna ODBCINST

  2. T-SQL k vyhledání názvu vzdáleného serveru propojeného serveru

  3. ORA-12154 nedokázal vyřešit zadaný identifikátor připojení

  4. Rozdíl mezi LIKE a ~ v Postgresu