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()
nahradila
at
(každý jednotlivý znak)REPLACE()
nahrazenoat
(ř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: