I Oracle er TRANSLATE()
funktionen giver dig mulighed for at foretage flere enkelttegn, en-til-en udskiftninger i én operation.
Det returnerer strengen, der er angivet som et første argument, efter at nogle tegn, der er angivet i det andet argument, er oversat til et destinationssæt af tegn, der er angivet i det tredje argument.
Det ligner REPLACE()
funktion, bortset fra at REPLACE()
funktion erstatter hele strengen med en anden streng (dvs. ikke tegn for tegn, såsom TRANSLATE()
gør).
Syntaks
Syntaksen ser sådan ud:
TRANSLATE(expr, from_string, to_string)
Funktionen returnerer expr
med alle forekomster af hvert tegn i from_string
erstattet af dets tilsvarende tegn i to_string
.
Eksempel
Her er et grundlæggende eksempel:
SELECT
TRANSLATE('Cat', 'at', 'ow')
FROM DUAL;
Resultat:
Ko
Her er a
og t
tegn blev erstattet med o
og w
.
I dette tilfælde er REPLACE()
funktion ville have givet det samme resultat. Her er de to funktioner side om side:
SELECT
TRANSLATE('Cat', 'at', 'ow') AS "TRANSLATE",
REPLACE('Cat', 'at', 'ow') AS "REPLACE"
FROM DUAL;
Resultat:
OVERSÆT ERSTAT ____________ __________ Ko Ko
I dette tilfælde er resultatet for begge funktioner det samme, men af forskellige årsager.
Her er, hvad hver funktion gjorde:
TRANSLATE()
erstatteta
ogt
(hver enkelt karakter)REPLACE()
erstattetat
(strengen)
Blandet rækkefølge
Dette eksempel viser hvor TRANSLATE()
adskiller sig fra REPLACE()
. I dette eksempel ændrer jeg rækkefølgen af de tegn, der skal erstattes, samt de tegn, der skal erstatte dem:
SELECT
TRANSLATE('Cat', 'ta', 'wo') AS "TRANSLATE",
REPLACE('Cat', 'ta', 'wo') AS "REPLACE"
FROM DUAL;
Resultat:
OVERSÆT ERSTAT ____________ __________ Ko kat
I dette tilfælde kun TRANSLATE()
funktion trådte i kraft. Dette skyldes, at denne funktion gennemgår hvert tegn en efter en. REPLACE()
funktion på den anden side søger efter hele strengen, i nøjagtig samme rækkefølge.
Et mere kraftfuldt eksempel
Dette eksempel viser et scenarie, hvor TRANSLATE()
funktionen har en betydelig fordel i forhold til REPLACE()
funktion:
SELECT
TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()')
FROM DUAL;
Resultat:
2*(3+4)/(7-2)
For at få det tilsvarende resultat ved hjælp af REPLACE()
funktion, skal vi gøre dette:
SELECT
REPLACE
(
REPLACE
(
REPLACE
(
REPLACE
(
'2*[3+4]/{7-2}',
'[',
'('
),
']',
')'
),
'{',
'('
),
'}',
')'
)
FROM DUAL;
Resultat:
2*(3+4)/(7-2)
Ovenstående eksempel er baseret på Microsoft-dokumentationen for T-SQL TRANSLATE()
funktion, som ligner Oracle-versionen.
Ingen match
Hvis der ikke er nogen match, TRANSLATE()
returnerer strengen uændret:
SELECT
TRANSLATE('Cat', 'x', 'y')
FROM DUAL;
Resultat:
Kat
Skrivar og bogstaver
TRANSLATE()
funktion udfører et match, der skelner mellem store og små bogstaver:
SELECT
TRANSLATE('Cat', 'AT', 'ow')
FROM DUAL;
Resultat:
Kat
I dette eksempel matchede sagen ikke, og derfor blev den oprindelige streng returneret uændret.
Tomme strenge
Her er, hvad der sker, når en tom streng sendes for hvert givet argument:
SET NULL 'null';
SELECT
TRANSLATE('Cat', 'at', '') AS r1,
TRANSLATE('Cat', '', 'ow') AS r2,
TRANSLATE('', 'at', 'ow') AS r3
FROM DUAL;
Resultat:
R1 R2 R3 _______ _______ _______ null null null
Som standard returnerer SQLcl og SQL*Plus et tomt mellemrum, når null
opstår som et resultat af en SQL SELECT
udmelding.
Du kan dog bruge SET NULL
for at angive en anden streng, der skal returneres. Her specificerede jeg, at strengen null
skal returneres.
Mellemrumstegn
Den tomme streng er ikke det samme som mellemrumstegnet.
Her er, hvad der sker, når vi ændrer den tomme streng til et mellemrum:
SELECT
TRANSLATE('Cat', 'at', ' ') AS r1,
TRANSLATE('Cat', ' ', 'ow') AS r2,
TRANSLATE(' ', 'at', 'ow') AS r3
FROM DUAL;
Resultat:
R1 R2 R3 _____ ______ _____ C Kat
Her er et eksempel, der illustrerer, hvordan TRANSLATE()
og REPLACE()
returnere forskellige resultater, når du bruger mellemrumstegnet:
SELECT
TRANSLATE(' ', ' ', 'Cow') AS TRANSLATE,
REPLACE(' ', ' ', 'Cow') AS REPLACE
FROM DUAL;
Resultat:
OVERSÆT ERSTAT ____________ __________ C Ko
Nul-argumenter
Sender null
for ethvert argument returnerer 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;
Resultat:
1 2 3 _______ _______ _______ null null null
Manglende argumenter
Kalder TRANSLATE()
uden at sende nogen argumenter resulterer det i en fejl:
SELECT TRANSLATE()
FROM DUAL;
Resultat:
Fejl starter på linje :1 i kommando -SELECT TRANSLATE()FROM DUALE Fejl på kommandolinje :1 Kolonne :8Fejlrapport -SQL-fejl:ORA-00938:ikke nok argumenter til funktion00938. 00000 - "ikke nok argumenter for funktion"*Årsag:*Handling:
For mange argumenter
Og at sende for mange argumenter returnerer en fejl:
SELECT TRANSLATE('Cat', 'a', 'b', 'c')
FROM DUAL;
Resultat:
Fejl starter på linje :1 i kommando -SELECT TRANSLATE('Cat', 'a', 'b', 'c')FRA DUALE Fejl på kommandolinje:1 Kolonne:8Fejlrapport -SQL-fejl:ORA-00909:ugyldigt antal argumenter00909. 00000 - "ugyldigt antal argumenter"*Årsag:*Handling: