Oracle
 sql >> база данни >  >> RDS >> Oracle

Функция TRANSLATE() в Oracle

В 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:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. къде трябва да сложа ресурси на инсталационната програма (wxs файл, dmg-script, икона) и как да конфигурирам maven antrun при внедряване на самостоятелно приложение

  2. ORA-22905 - при запитване на тип таблица с оператор select

  3. Най-бързият начин да проверите дали някои записи в таблицата на базата данни?

  4. Oracle PL/SQL – Колекции (вложени таблици)

  5. Как да проверя дали курсорът връща записи в oracle?