sql >> Databasteknik >  >> RDS >> Oracle

TRANSLATE() Funktion i Oracle

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() ersatte a och t (varje enskild karaktär)
  • REPLACE() ersatt at (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:

  1. hur man tilldelar cte-värde till variabel

  2. Hur hoppar man över kolumner i CSV-fil när man importerar till MySQL-tabell med LOAD DATA INFILE?

  3. Mysql räknar instanser av delsträng, sortera sedan efter

  4. SQL jämförelseoperatör