I Oracle er INSTR()
funktionen søger efter en understreng i en given streng og returnerer et heltal, der angiver placeringen af det første tegn i denne understreng. Hvis understrengen ikke findes, returnerer funktionen 0
.
INSTR()
kræver mindst to argumenter; strengen og understrengen. Den accepterer også et valgfrit tredje og fjerde argument, der giver dig mulighed for at angive startpositionen for at søge, og hvilken forekomst der skal søges efter.
INSTR()
kan også opfattes som en gruppe af funktioner. Der er fem separate funktioner; INSTR()
, INSTRB()
, INSTRC()
, INSTR2()
, og INSTR4()
. Hver funktion beregner længden på en anden måde.
Syntaks
Syntaksen ser sådan ud:
{ INSTR| INSTRB| INSTRC| INSTR2| INSTR4}(streng , understreng [, position [, forekomst ] ])
Hvor streng
er strengen, der skal søges i, understreng
er den understreng, der skal findes, position
er startpositionen for understrengen og forekomst
er, hvilken forekomst der skal findes.
Funktionerne beregner længder som følger:
Funktion | Beregner længde ved hjælp af... |
---|---|
INSTR() | Tegn som defineret af inputtegnsættet, hvor det første tegn i strengen har position 1. |
INSTRB() | Bytes |
INSTRC() | Complete Unicode-tegn |
INSTR2() | UCS2-kodepunkter |
INSTR4() | UCS4-kodepunkter |
Eksempel
Her er et grundlæggende eksempel:
VÆLG INSTR('Big fat cat', 'fat')FROM DUAL;
Resultat:
5
Sammenlignet med INSTRB()
Dette eksempel viser, hvordan resultaterne kan variere, afhængigt af hvilken specifik funktion du bruger, og det involverede tegnsæt.
I dette tilfælde sammenligner vi INSTR()
med INSTRB()
:
VÆLG INSTR('Böyük yağlı pişik', 'yağlı') AS INSTR, INSTRB('Böyük yağlı pişik', 'yağlı') SOM INSTRBFRA DUAL;
Resultat:
INSTR INSTRB ________ ______ 7 9
Vi kan se, at de to funktioner gav to forskellige resultater. Dette skyldes, at nogle tegn i denne streng bruger to bytes.
INSTR()
funktion returnerer positionen som defineret af inputtegnsættet, hvorimod INSTRB()
funktion returnerer positionen baseret i bytes .
Hvis vi vender tilbage til den oprindelige streng, er resultaterne de samme mellem de to funktioner:
VÆLG INSTR('Big fat cat', 'fat') AS INSTR, INSTRB('Big fat cat', 'fat') AS INSTRBFROM DUAL;
Resultat:
INSTR INSTRB ________ ______ 5 5
Det skyldes, at denne streng kun bruger én byte pr. tegn, og så længden i bytes er den samme som antallet af tegn.
Startposition
Her er et eksempel, der specificerer den position, som søgningen skal startes efter:
SELECT INSTR('Den fede kat', 'at', 8)FRA DUAL;
Resultat:
11
I dette tilfælde starter søgningen ved position 8, hvilket er efter de to første forekomster. Derfor får vi stillingen til den tredje kamp.
Angiv hvilken forekomst
Her er et eksempel på at specificere, hvilken forekomst der skal findes:
VÆLG INSTR('Den fede kat', 'at', 1, 2)FRA DUAL;
Resultat:
7
I dette tilfælde startede vi ved position 1 og søgte derefter efter den anden forekomst fra den startposition.
Her er det igen, men denne gang sammenligner vi tre forskellige værdier for forekomsten
argument:
SELECT INSTR('Den fede kat', 'at', 1, 1) AS "o1", INSTR('Den tykke kat', 'at', 1, 2) SOM "o2", INSTR ('Den fede kat', 'at', 1, 3) SOM "o3"FRA DUAL;
Resultat:
o1 o2 o3 _____ _____ _____ 3 7 11
Men her er, hvad der sker, hvis vi øger positionen
argument:
SELECT INSTR('Den tykke kat', 'at', 5, 1) AS "o1", INSTR('Den tykke kat', 'at', 5, 2) SOM "o2", INSTR ('Den fede kat', 'at', 5, 3) SOM "o3"FRA DUAL;
Resultat:
o1 o2 o3 _____ _____ _____ 7 11 0
I dette tilfælde får vi ikke positionen for den første forekomst, fordi den er placeret før vores startposition. Vi får også 0
i den tredje kolonne, fordi der ikke er nogen tredje forekomst baseret på vores startposition.
Negativ position
Angivelse af en negativ værdi for positionen bevirker, at startpositionen tælles bagud fra slutningen af strengen, og Oracle søger baglæns fra denne position:
VÆLG INSTR('Den fede kat', 'ved', -3)FRA DUAL;
Resultat:
7
Og enhver forekomst, der er angivet, tælles tilbage fra den position:
VÆLG INSTR('Den fede kat', 'at', -3, 2)FRA DUAL;
Resultat:
3
Nul-argumenter
Hvis nogen (eller alle) af argumenterne er null
, resultatet er null
:
SET NULL 'null';SELECT INSTR(null, 'f', 1, 1) AS r1, INSTR('Coffee', null, 1, 1) AS r2, INSTR('Coffee', ' f', null, 1) AS r3, INSTR('Kaffe', 'f', 1, null) AS r4FROM DUAL;
Resultat:
R1 R2 R3 R4 _______ _______ _______ _______ null 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.
Forkert antal argumenter
Kalder INSTR()
uden at sende nogen argumenter resulterer det i en fejl:
VÆLG INSTR()FRA DUAL;
Resultat:
Fejl starter på linje:1 i kommando -SELECT INSTR()FROM DUALEfejl på kommandolinje:1 Kolonne:8Fejlrapport -SQL-fejl:ORA-00938:ikke nok argumenter til funktion00938. 00000 - "ikke nok argumenter for funktion"*Årsag:*Handling:
Og at sende for mange argumenter resulterer også i en fejl:
SELECT INSTR('Big fat cat', 'at', 1, 2, 3)FROM DUAL;
Resultat:
Fejl starter på linje:1 i kommando -SELECT INSTR('Big fat cat', 'at', 1, 2, 3)FROM DUALEfejl på kommandolinje:1 kolonne:38Fejlrapport -SQL-fejl:ORA-00939:for mange argumenter til funktion00939. 00000 - "for mange argumenter for funktion"*Årsag:*Handling: