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ąpionoa
it
(każda indywidualna postać)REPLACE()
zastąpionoat
(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: