sql >> Database >  >> RDS >> Oracle

INSTR() Functie in Oracle

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:

  1. Hoe PCI-compliance voor MySQL en MariaDB te bereiken met ClusterControl - The Replay

  2. 2 manieren om een ​​database op een gekoppelde server te maken met behulp van T-SQL

  3. MySQL VOLLEDIG AANMELDEN?

  4. De backend-versie wordt niet ondersteund om databasediagrammen of tabellen te ontwerpen