I Oracle, TRANSLATE()
funktionen låter dig göra flera en-till-en-ersättningar med ett tecken i en operation.
Den returnerar strängen som tillhandahålls som ett första argument efter att några tecken som anges i det andra argumentet har översatts till en måluppsättning tecken som anges i det tredje argumentet.
Det liknar REPLACE()
funktion, förutom att REPLACE()
funktion ersätter hela strängen med en annan sträng (dvs inte tecken för tecken, som TRANSLATE()
gör).
Syntax
Syntaxen ser ut så här:
TRANSLATE(expr, from_string, to_string)
Funktionen returnerar expr
med alla förekomster av varje tecken i from_string
ersätts av dess motsvarande tecken i to_string
.
Exempel
Här är ett grundläggande exempel:
SELECT
TRANSLATE('Cat', 'at', 'ow')
FROM DUAL;
Resultat:
Cow
Här, a
och t
tecken ersattes med o
och w
.
I det här fallet används REPLACE()
funktion skulle ha gett samma resultat. Här är de två funktionerna sida vid sida:
SELECT
TRANSLATE('Cat', 'at', 'ow') AS "TRANSLATE",
REPLACE('Cat', 'at', 'ow') AS "REPLACE"
FROM DUAL;
Resultat:
TRANSLATE REPLACE ____________ __________ Cow Cow
I det här fallet är resultatet för båda funktionerna detsamma, men av olika anledningar.
Så här gjorde varje funktion:
TRANSLATE()
ersattea
ocht
(varje enskild karaktär)REPLACE()
ersattat
(strängen)
Blandad ordning
Det här exemplet visar var TRANSLATE()
skiljer sig från REPLACE()
. I det här exemplet ändrar jag ordningen på de tecken som ska ersättas, såväl som de tecken som ska ersätta dem:
SELECT
TRANSLATE('Cat', 'ta', 'wo') AS "TRANSLATE",
REPLACE('Cat', 'ta', 'wo') AS "REPLACE"
FROM DUAL;
Resultat:
TRANSLATE REPLACE ____________ __________ Cow Cat
I det här fallet endast TRANSLATE()
funktionen trädde i kraft. Detta beror på att denna funktion går igenom varje tecken en efter en. REPLACE()
funktion å andra sidan, letar efter hela strängen, i exakt samma ordning.
Ett mer kraftfullt exempel
Det här exemplet visar ett scenario där TRANSLATE()
funktionen har en betydande fördel jämfört med REPLACE()
funktion:
SELECT
TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()')
FROM DUAL;
Resultat:
2*(3+4)/(7-2)
För att få motsvarande resultat med REPLACE()
funktion måste vi göra detta:
SELECT
REPLACE
(
REPLACE
(
REPLACE
(
REPLACE
(
'2*[3+4]/{7-2}',
'[',
'('
),
']',
')'
),
'{',
'('
),
'}',
')'
)
FROM DUAL;
Resultat:
2*(3+4)/(7-2)
Exemplet ovan är baserat på Microsoft-dokumentationen för T-SQL TRANSLATE()
funktion, som liknar Oracle-versionen.
Ingen match
Om det inte finns några matchningar, TRANSLATE()
returnerar strängen oförändrad:
SELECT
TRANSLATE('Cat', 'x', 'y')
FROM DUAL;
Resultat:
Cat
Skaftkänslighet
TRANSLATE()
funktion utför en skiftlägeskänslig matchning:
SELECT
TRANSLATE('Cat', 'AT', 'ow')
FROM DUAL;
Resultat:
Cat
I det här exemplet stämde inte fallet, så den ursprungliga strängen returnerades oförändrad.
Tömma strängar
Så här händer när en tom sträng skickas för varje 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 returnerar SQLcl och SQL*Plus ett tomt utrymme när null
uppstår som ett resultat av en SQL SELECT
påstående.
Du kan dock använda SET NULL
för att ange en annan sträng som ska returneras. Här specificerade jag att strängen null
bör returneras.
Mellanslagstecken
Den tomma strängen är inte detsamma som mellanslagstecknet.
Så här händer när vi ändrar den tomma strängen till ett mellanslag:
SELECT
TRANSLATE('Cat', 'at', ' ') AS r1,
TRANSLATE('Cat', ' ', 'ow') AS r2,
TRANSLATE(' ', 'at', 'ow') AS r3
FROM DUAL;
Resultat:
R1 R2 R3 _____ ______ _____ C Cat
Här är ett exempel som illustrerar hur TRANSLATE()
och REPLACE()
returnera olika resultat när du använder blanksteg:
SELECT
TRANSLATE(' ', ' ', 'Cow') AS TRANSLATE,
REPLACE(' ', ' ', 'Cow') AS REPLACE
FROM DUAL;
Resultat:
TRANSLATE REPLACE ____________ __________ C Cow
Nollargument
Skickar null
för alla argument returnerar 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
Argument saknas
Anropar TRANSLATE()
utan att skicka några argument resulterar i ett fel:
SELECT TRANSLATE()
FROM DUAL;
Resultat:
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:
För många argument
Och att skicka för många argument returnerar ett fel:
SELECT TRANSLATE('Cat', 'a', 'b', 'c')
FROM DUAL;
Resultat:
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: