В Oracle, TRANSLATE()
функцията ви позволява да направите няколко едносимволни замествания едно към едно в една операция.
Той връща низа, предоставен като първи аргумент, след като някои знаци, посочени във втория аргумент, са преведени в целеви набор от знаци, посочени в третия аргумент.
Това е подобно на REPLACE()
функция, освен че REPLACE()
функцията замества целия низ с друг низ (т.е. не символ по знак, като TRANSLATE()
прави).
Синтаксис
Синтаксисът е така:
TRANSLATE(expr, from_string, to_string)
Функцията връща expr
с всички срещания на всеки знак в from_string
заменен със съответния му знак в to_string
.
Пример
Ето един основен пример:
SELECT
TRANSLATE('Cat', 'at', 'ow')
FROM DUAL;
Резултат:
Cow
Тук a
и t
знаците бяха заменени с o
и w
.
В този случай, REPLACE()
функцията би довела до същия резултат. Ето двете функции една до друга:
SELECT
TRANSLATE('Cat', 'at', 'ow') AS "TRANSLATE",
REPLACE('Cat', 'at', 'ow') AS "REPLACE"
FROM DUAL;
Резултат:
TRANSLATE REPLACE ____________ __________ Cow Cow
В този случай резултатът и за двете функции е един и същ, но по различни причини.
Ето какво направи всяка функция:
TRANSLATE()
замененa
иt
(всеки отделен знак)REPLACE()
замененat
(низът)
Смесена поръчка
Този пример демонстрира къде TRANSLATE()
се различава от REPLACE()
. В този пример променям реда на знаците, които трябва да бъдат заменени, както и знаците, които да ги заменят:
SELECT
TRANSLATE('Cat', 'ta', 'wo') AS "TRANSLATE",
REPLACE('Cat', 'ta', 'wo') AS "REPLACE"
FROM DUAL;
Резултат:
TRANSLATE REPLACE ____________ __________ Cow Cat
В този случай само TRANSLATE()
функцията влезе в сила. Това е така, защото тази функция преминава през всеки знак един по един. REPLACE()
функцията от друга страна търси целия низ, в абсолютно същия ред.
По-мощен пример
Този пример демонстрира сценарий, при който TRANSLATE()
функцията има значително предимство пред REPLACE()
функция:
SELECT
TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()')
FROM DUAL;
Резултат:
2*(3+4)/(7-2)
За да получите еквивалентен резултат, използвайте REPLACE()
функция, ще трябва да направим това:
SELECT
REPLACE
(
REPLACE
(
REPLACE
(
REPLACE
(
'2*[3+4]/{7-2}',
'[',
'('
),
']',
')'
),
'{',
'('
),
'}',
')'
)
FROM DUAL;
Резултат:
2*(3+4)/(7-2)
Горният пример се базира на документацията на Microsoft за T-SQL TRANSLATE()
функция, която е подобна на версията на Oracle.
Няма съвпадение
Ако няма съвпадения, TRANSLATE()
връща низа непроменен:
SELECT
TRANSLATE('Cat', 'x', 'y')
FROM DUAL;
Резултат:
Cat
Чувствителност на регистрите
TRANSLATE()
функцията извършва съвпадение с чувствителност към малки и големи букви:
SELECT
TRANSLATE('Cat', 'AT', 'ow')
FROM DUAL;
Резултат:
Cat
В този пример случайът не съвпада и така оригиналният низ беше върнат непроменен.
Празни низове
Ето какво се случва, когато се подаде празен низ за всеки даден аргумент:
SET NULL 'null';
SELECT
TRANSLATE('Cat', 'at', '') AS r1,
TRANSLATE('Cat', '', 'ow') AS r2,
TRANSLATE('', 'at', 'ow') AS r3
FROM DUAL;
Резултат:
R1 R2 R3 _______ _______ _______ null null null
По подразбиране SQLcl и SQL*Plus връщат празно пространство всеки път, когато null
възниква в резултат на SQL SELECT
изявление.
Можете обаче да използвате SET NULL
за да посочите различен низ, който да бъде върнат. Тук посочих, че низът null
трябва да бъдат върнати.
Символ за интервал
Празният низ не е същият като символа за интервал.
Ето какво се случва, когато променим празния низ в интервал:
SELECT
TRANSLATE('Cat', 'at', ' ') AS r1,
TRANSLATE('Cat', ' ', 'ow') AS r2,
TRANSLATE(' ', 'at', 'ow') AS r3
FROM DUAL;
Резултат:
R1 R2 R3 _____ ______ _____ C Cat
Ето пример, който илюстрира как TRANSLATE()
и REPLACE()
връща различни резултати, когато използвате символа за интервал:
SELECT
TRANSLATE(' ', ' ', 'Cow') AS TRANSLATE,
REPLACE(' ', ' ', 'Cow') AS REPLACE
FROM DUAL;
Резултат:
TRANSLATE REPLACE ____________ __________ C Cow
Нулеви аргументи
Предаването на null
за всеки аргумент връща 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;
Резултат:
1 2 3 _______ _______ _______ null null null
Липсващи аргументи
Извикване на TRANSLATE()
без подаване на аргументи води до грешка:
SELECT TRANSLATE()
FROM DUAL;
Резултат:
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:
Твърде много аргументи
И предаването на твърде много аргументи връща грешка:
SELECT TRANSLATE('Cat', 'a', 'b', 'c')
FROM DUAL;
Резултат:
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: