sql >> Database >  >> RDS >> Oracle

TRANSLATE() Functie in Oracle

In Oracle, de TRANSLATE() Met deze functie kunt u meerdere één-op-één-vervangingen van één teken maken in één bewerking.

Het retourneert de tekenreeks die als eerste argument is opgegeven nadat enkele tekens die in het tweede argument zijn gespecificeerd, zijn vertaald in een doelset van tekens die in het derde argument zijn gespecificeerd.

Het is vergelijkbaar met de REPLACE() functie, behalve dat de REPLACE() functie vervangt de hele tekenreeks door een andere tekenreeks (d.w.z. niet teken voor teken, zoals TRANSLATE() doet).

Syntaxis

De syntaxis gaat als volgt:

TRANSLATE(expr, from_string, to_string)

De functie retourneert expr met alle voorkomens van elk teken in from_string vervangen door het bijbehorende teken in to_string .

Voorbeeld

Hier is een eenvoudig voorbeeld:

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

Resultaat:

Cow

Hier, de a en t tekens zijn vervangen door o en w .

In dit geval is de REPLACE() functie zou hetzelfde resultaat hebben opgeleverd. Hier zijn de twee functies naast elkaar:

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

Resultaat:

   TRANSLATE    REPLACE 
____________ __________ 
Cow          Cow       

In dit geval is de uitkomst voor beide functies hetzelfde, maar om verschillende redenen.

Dit is wat elke functie deed:

  • TRANSLATE() vervangen a en t (elk afzonderlijk teken)
  • REPLACE() vervangen at (de string)

Gemengde volgorde

Dit voorbeeld laat zien waar TRANSLATE() verschilt van REPLACE() . In dit voorbeeld verander ik de volgorde van de tekens die moeten worden vervangen, evenals de tekens om ze te vervangen:

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

Resultaat:

   TRANSLATE    REPLACE 
____________ __________ 
Cow          Cat       

In dit geval alleen de TRANSLATE() functie in werking is getreden. Dit komt omdat deze functie elk teken één voor één doorloopt. De REPLACE() functie daarentegen zoekt naar de hele string, in precies dezelfde volgorde.

Een krachtiger voorbeeld

Dit voorbeeld demonstreert een scenario waarin de TRANSLATE() functie heeft een aanzienlijk voordeel ten opzichte van de REPLACE() functie:

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

Resultaat:

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

Om het equivalente resultaat te krijgen met de REPLACE() functie, moeten we dit doen:

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

Resultaat:

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

Het bovenstaande voorbeeld is gebaseerd op de Microsoft-documentatie voor de T-SQL TRANSLATE() functie, die vergelijkbaar is met de Oracle-versie.

Geen overeenkomst

Als er geen overeenkomsten zijn, TRANSLATE() geeft de string ongewijzigd terug:

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

Resultaat:

Cat

Hoofdlettergevoeligheid

De TRANSLATE() functie voert een hoofdlettergevoelige overeenkomst uit:

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

Resultaat:

Cat

In dit voorbeeld kwam de case niet overeen, en dus werd de originele string ongewijzigd geretourneerd.

Lege snaren

Dit is wat er gebeurt als een lege string wordt doorgegeven voor elk gegeven argument:

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

Resultaat:

     R1      R2      R3 
_______ _______ _______ 
null    null    null   

Standaard retourneren SQLcl en SQL*Plus een spatie wanneer null treedt op als resultaat van een SQL SELECT uitspraak.

U kunt echter SET NULL . gebruiken om een ​​andere tekenreeks op te geven die moet worden geretourneerd. Hier heb ik gespecificeerd dat de string null moet worden geretourneerd.

Spatieteken

De lege tekenreeks is niet hetzelfde als het spatieteken.

Dit is wat er gebeurt als we de lege tekenreeks in een spatie veranderen:

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

Resultaat:

   R1     R2    R3 
_____ ______ _____ 
C     Cat         

Hier is een voorbeeld dat illustreert hoe TRANSLATE() en REPLACE() verschillende resultaten retourneren bij gebruik van het spatieteken:

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

Resultaat:

   TRANSLATE    REPLACE 
____________ __________ 
C            Cow       

Nullargumenten

Doorgeven van null voor elk argument retourneert 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;

Resultaat:

      1       2       3 
_______ _______ _______ 
null    null    null   

Ontbrekende argumenten

TRANSLATE() . aanroepen zonder het doorgeven van argumenten resulteert in een fout:

SELECT TRANSLATE()
FROM DUAL;

Resultaat:

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:

Te veel argumenten

En het doorgeven van te veel argumenten levert een fout op:

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

Resultaat:

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. Spreadsheets versus databases:is het tijd om over te stappen? Deel 1

  2. SQL-cast datum/tijd

  3. SQLite GEVAL

  4. Ongeldig syntaxisfouttype =MyISAM in DDL gegenereerd door Hibernate