Oracle
 sql >> Baza danych >  >> RDS >> Oracle

TRANSLATE() Funkcja w Oracle

W Oracle TRANSLATE() Funkcja umożliwia wykonanie kilku jednoznakowych podmian jeden do jednego w jednej operacji.

Zwraca ciąg dostarczony jako pierwszy argument po tym, jak niektóre znaki określone w drugim argumencie zostaną przetłumaczone na docelowy zestaw znaków określony w trzecim argumencie.

Jest podobny do REPLACE() z wyjątkiem funkcji REPLACE() funkcja zastępuje cały ciąg innym ciągiem (tzn. nie znak po znaku, jak TRANSLATE() tak).

Składnia

Składnia wygląda tak:

TRANSLATE(expr, from_string, to_string)

Funkcja zwraca expr ze wszystkimi wystąpieniami każdego znaku w from_string zastąpiony odpowiadającym mu znakiem w to_string .

Przykład

Oto podstawowy przykład:

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

Wynik:

Cow

Tutaj a i t znaki zostały zastąpione przez o i at .

W tym przypadku REPLACE() funkcja dałaby ten sam wynik. Oto dwie funkcje obok siebie:

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

Wynik:

   TRANSLATE    REPLACE 
____________ __________ 
Cow          Cow       

W tym przypadku wynik dla obu funkcji jest taki sam, ale z różnych powodów.

Oto, co zrobiła każda funkcja:

  • TRANSLATE() zastąpiono a i t (każda indywidualna postać)
  • REPLACE() zastąpiono at (ciąg)

Zamówienie mieszane

Ten przykład pokazuje, gdzie TRANSLATE() różni się od REPLACE() . W tym przykładzie zmieniam kolejność znaków do zastąpienia, a także znaki, które mają je zastąpić:

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

Wynik:

   TRANSLATE    REPLACE 
____________ __________ 
Cow          Cat       

W tym przypadku tylko TRANSLATE() funkcja zaczęła obowiązywać. Dzieje się tak, ponieważ ta funkcja przechodzi przez każdy znak jeden po drugim. REPLACE() z drugiej strony, szuka całego ciągu w dokładnie tej samej kolejności.

Potężniejszy przykład

Ten przykład ilustruje scenariusz, w którym funkcja TRANSLATE() funkcja ma znaczną przewagę nad REPLACE() funkcja:

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

Wynik:

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

Aby uzyskać równoważny wynik za pomocą REPLACE() funkcji, musielibyśmy to zrobić:

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

Wynik:

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

Powyższy przykład jest oparty na dokumentacji Microsoft dla T-SQL TRANSLATE() funkcja, która jest podobna do wersji Oracle.

Brak dopasowania

Jeśli nie ma dopasowań, TRANSLATE() zwraca ciąg niezmieniony:

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

Wynik:

Cat

Wrażliwość na wielkość liter

TRANSLATE() funkcja wykonuje dopasowanie z uwzględnieniem wielkości liter:

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

Wynik:

Cat

W tym przykładzie wielkość liter się nie zgadzała, więc oryginalny ciąg został zwrócony bez zmian.

Puste ciągi

Oto, co się dzieje, gdy dla każdego podanego argumentu zostanie przekazany pusty ciąg:

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

Wynik:

     R1      R2      R3 
_______ _______ _______ 
null    null    null   

Domyślnie SQLcl i SQL*Plus zwracają spację, gdy null występuje w wyniku polecenia SQL SELECT oświadczenie.

Możesz jednak użyć SET NULL aby określić inny ciąg do zwrócenia. Tutaj określiłem, że ciąg null należy zwrócić.

Znak spacji

Pusty ciąg nie jest tym samym, co znak spacji.

Oto, co się dzieje, gdy zmieniamy pusty ciąg na spację:

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

Wynik:

   R1     R2    R3 
_____ ______ _____ 
C     Cat         

Oto przykład ilustrujący, jak TRANSLATE() i REPLACE() zwracać różne wyniki przy użyciu znaku spacji:

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

Wynik:

   TRANSLATE    REPLACE 
____________ __________ 
C            Cow       

Argumenty zerowe

Przekazywanie null dla dowolnego argumentu zwraca 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;

Wynik:

      1       2       3 
_______ _______ _______ 
null    null    null   

Brakujące argumenty

Wywołanie TRANSLATE() bez przekazywania jakichkolwiek argumentów powoduje błąd:

SELECT TRANSLATE()
FROM DUAL;

Wynik:

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:

Zbyt wiele argumentów

A przekazanie zbyt wielu argumentów zwraca błąd:

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

Wynik:

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. Funkcja SUBSTR() w Oracle

  2. Dlaczego nie mogę zrobić a z x jako (...) z ADODB i Oracle?

  3. Dostrajanie SQL

  4. Sprawdź, czy bieżąca data jest między dwiema datami Oracle SQL

  5. OracleException (0x80004005) podczas łączenia się z bazą danych Oracle