In Oracle, de INSTR()
functie zoekt naar een subtekenreeks in een gegeven tekenreeks en retourneert een geheel getal dat de positie van het eerste teken van deze subtekenreeks aangeeft. Als de subtekenreeks niet wordt gevonden, retourneert de functie 0
.
INSTR()
vereist ten minste twee argumenten; de tekenreeks en de subtekenreeks. Het accepteert ook een optioneel derde en vierde argument waarmee u de startpositie kunt specificeren waarnaar moet worden gezocht en naar welke instantie moet worden gezocht.
INSTR()
kan ook worden gezien als een groep functies. Er zijn vijf afzonderlijke functies; INSTR()
, INSTRB()
, INSTRC()
, INSTR2()
, en INSTR4()
. Elke functie berekent de lengte op een andere manier.
Syntaxis
De syntaxis gaat als volgt:
{ INSTR
| INSTRB
| INSTRC
| INSTR2
| INSTR4
}
(string , substring [, position [, occurrence ] ])
Waar string
is de string om te zoeken, substring
is de substring die moet worden gevonden, position
is de startpositie van de subtekenreeks, en occurrence
is welk voorkomen te vinden.
De functies berekenen de lengtes als volgt:
Functie | Berekent lengte met… |
---|---|
INSTR() | Tekens zoals gedefinieerd door de invoertekenset, waarbij het eerste teken van de tekenreeks positie 1 heeft. |
INSTRB() | Bytes |
INSTRC() | Unicode volledige tekens |
INSTR2() | UCS2-codepunten |
INSTR4() | UCS4-codepunten |
Voorbeeld
Hier is een eenvoudig voorbeeld:
SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;
Resultaat:
5
Vergeleken met INSTRB()
Dit voorbeeld laat zien hoe de resultaten kunnen verschillen, afhankelijk van de specifieke functie die u gebruikt en de betrokken tekenset.
In dit geval vergelijken we INSTR()
met INSTRB()
:
SELECT
INSTR('Böyük yağlı pişik', 'yağlı') AS INSTR,
INSTRB('Böyük yağlı pişik', 'yağlı') AS INSTRB
FROM DUAL;
Resultaat:
INSTR INSTRB ________ _________ 7 9
We kunnen zien dat de twee functies twee verschillende resultaten hebben opgeleverd. Dit komt omdat sommige tekens in deze tekenreeks twee bytes gebruiken.
De INSTR()
functie retourneert de positie zoals gedefinieerd door de invoertekenset, terwijl de INSTRB()
functie retourneert de positie op basis van bytes .
Als we terugkeren naar de originele string, zijn de resultaten hetzelfde tussen de twee functies:
SELECT
INSTR('Big fat cat', 'fat') AS INSTR,
INSTRB('Big fat cat', 'fat') AS INSTRB
FROM DUAL;
Resultaat:
INSTR INSTRB ________ _________ 5 5
Dat komt omdat deze string slechts één byte per teken gebruikt, en dus is de lengte in bytes gelijk aan het aantal tekens.
Startpositie
Hier is een voorbeeld dat de positie specificeert waarvoor de zoekopdracht moet worden gestart:
SELECT INSTR('That fat cat', 'at', 8)
FROM DUAL;
Resultaat:
11
In dit geval begint het zoeken op positie 8, dat is na de eerste twee keer dat het voorkomt. Daarom krijgen we de positie van de derde wedstrijd.
Specificeer welke gebeurtenis
Hier is een voorbeeld van het specificeren van welke instantie moet worden gevonden:
SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;
Resultaat:
7
In dit geval begonnen we op positie 1 en zochten vervolgens naar het tweede exemplaar vanaf die startpositie.
Hier is het weer, maar deze keer vergelijken we drie verschillende waarden voor het occurrence
argument:
SELECT
INSTR('That fat cat', 'at', 1, 1) AS "o1",
INSTR('That fat cat', 'at', 1, 2) AS "o2",
INSTR('That fat cat', 'at', 1, 3) AS "o3"
FROM DUAL;
Resultaat:
o1 o2 o3 _____ _____ _____ 3 7 11
Maar dit is wat er gebeurt als we de position
argument:
SELECT
INSTR('That fat cat', 'at', 5, 1) AS "o1",
INSTR('That fat cat', 'at', 5, 2) AS "o2",
INSTR('That fat cat', 'at', 5, 3) AS "o3"
FROM DUAL;
Resultaat:
o1 o2 o3 _____ _____ _____ 7 11 0
In dit geval krijgen we niet de positie van het eerste exemplaar, omdat het zich vóór onze startpositie bevindt. We krijgen ook 0
in de derde kolom omdat er geen derde instantie is, gebaseerd op onze startpositie.
Negatieve positie
Het specificeren van een negatieve waarde voor de positie zorgt ervoor dat de startpositie achteruit wordt geteld vanaf het einde van de string, en dat Oracle vanaf die positie achteruit zoekt:
SELECT INSTR('That fat cat', 'at', -3)
FROM DUAL;
Resultaat:
7
En elk voorkomen dat is opgegeven, wordt vanaf die positie teruggeteld:
SELECT INSTR('That fat cat', 'at', -3, 2)
FROM DUAL;
Resultaat:
3
Nullargumenten
Als een (of alle) argumenten null
. zijn , het resultaat is 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('Coffee', 'f', 1, null) AS r4
FROM DUAL;
Resultaat:
R1 R2 R3 R4 _______ _______ _______ _______ null 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.
Onjuist aantal argumenten
INSTR()
. aanroepen zonder het doorgeven van argumenten resulteert in een fout:
SELECT INSTR()
FROM DUAL;
Resultaat:
Error starting at line : 1 in command - SELECT INSTR() 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:
En het doorgeven van te veel argumenten resulteert ook in een fout:
SELECT INSTR('Big fat cat', 'at', 1, 2, 3)
FROM DUAL;
Resultaat:
Error starting at line : 1 in command - SELECT INSTR('Big fat cat', 'at', 1, 2, 3) FROM DUAL Error at Command Line : 1 Column : 38 Error report - SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function" *Cause: *Action: