Oracle
 sql >> Database >  >> RDS >> Oracle

INSTR() Funzione in Oracle

In Oracle, INSTR() La funzione ricerca una sottostringa in una determinata stringa e restituisce un numero intero che indica la posizione del primo carattere di questa sottostringa. Se la sottostringa non viene trovata, la funzione restituisce 0 .

INSTR() richiede almeno due argomenti; la stringa e la sottostringa. Accetta anche un terzo e un quarto argomento facoltativi che ti consentono di specificare la posizione iniziale da cercare e quale occorrenza cercare.

INSTR() può anche essere pensato come un insieme di funzioni. Ci sono cinque funzioni separate; INSTR() , INSTRB() , INSTRC() , INSTR2() e INSTR4() . Ogni funzione calcola la lunghezza in modo diverso.

Sintassi

La sintassi è questa:

{ INSTR
| INSTRB
| INSTRC
| INSTR2
| INSTR4
}
(string , substring [, position [, occurrence ] ])

Dove string è la stringa da cercare, substring è la sottostringa da trovare, position è la posizione iniziale della sottostringa e occurrence è l'occorrenza da trovare.

Le funzioni calcolano le lunghezze come segue:

Funzione Calcola la lunghezza usando...
INSTR() Caratteri definiti dal set di caratteri di input, con il primo carattere della stringa avente posizione 1.
INSTRB() Byte
INSTRC() Caratteri completi Unicode
INSTR2() Punti di codice UCS2
INSTR4() Punti di codice UCS4

Esempio

Ecco un esempio di base:

SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;

Risultato:

5

Rispetto a INSTRB()

Questo esempio mostra come i risultati possono differire, a seconda della funzione specifica che stai utilizzando e del set di caratteri coinvolto.

In questo caso, confrontiamo INSTR() con 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;

Risultato:

   INSTR    INSTRB 
________ _________ 
       7         9

Possiamo vedere che le due funzioni hanno restituito due risultati diversi. Questo perché alcuni caratteri in questa stringa utilizzano due byte.

Il INSTR() La funzione restituisce la posizione definita dal set di caratteri di input, mentre INSTRB() la funzione restituisce la posizione in byte .

Se torniamo alla stringa originale, i risultati sono gli stessi tra le due funzioni:

SELECT 
    INSTR('Big fat cat', 'fat') AS INSTR,
    INSTRB('Big fat cat', 'fat') AS INSTRB
FROM DUAL;

Risultato:

   INSTR    INSTRB 
________ _________ 
       5         5 

Questo perché questa stringa utilizza solo un byte per carattere, quindi la lunghezza in byte è uguale al numero di caratteri.

Posizione iniziale

Ecco un esempio che specifica la posizione per cui iniziare la ricerca:

SELECT INSTR('That fat cat', 'at', 8)
FROM DUAL;

Risultato:

11

In questo caso, la ricerca inizia dalla posizione 8, che è dopo le prime due occorrenze. Pertanto, otteniamo la posizione della terza partita.

Specifica quale occorrenza

Ecco un esempio per specificare quale occorrenza trovare:

SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;

Risultato:

7

In questo caso, abbiamo iniziato dalla posizione 1, quindi abbiamo cercato la seconda occorrenza da quella posizione iniziale.

Eccolo di nuovo, ma questa volta confrontiamo tre diversi valori per l'occurrence argomento:

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;

Risultato:

   o1    o2    o3 
_____ _____ _____ 
    3     7    11

Ma ecco cosa succede se aumentiamo la position argomento:

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;

Risultato:

   o1    o2    o3 
_____ _____ _____ 
    7    11     0 

In questo caso non otteniamo la posizione della prima occorrenza, perché si trova prima della nostra posizione di partenza. Otteniamo anche 0 nella terza colonna perché non c'è una terza occorrenza, in base alla nostra posizione di partenza.

Posizione negativa

Specificando un valore negativo per la posizione, la posizione iniziale viene contata all'indietro dalla fine della stringa e Oracle esegue la ricerca all'indietro da quella posizione:

SELECT INSTR('That fat cat', 'at', -3)
FROM DUAL;

Risultato:

7

E qualsiasi occorrenza specificata viene contata all'indietro da quella posizione:

SELECT INSTR('That fat cat', 'at', -3, 2)
FROM DUAL;

Risultato:

3

Argomenti nulli

Se uno (o tutti) gli argomenti sono null , il risultato è 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;

Risultato:

     R1      R2      R3      R4 
_______ _______ _______ _______ 
   null    null    null    null

Per impostazione predefinita, SQLcl e SQL*Plus restituiscono uno spazio vuoto ogni volta che null si verifica come risultato di un SQL SELECT dichiarazione.

Tuttavia, puoi utilizzare SET NULL per specificare una stringa diversa da restituire. Qui ho specificato che la stringa null deve essere restituito.

Conteggio argomenti errato

Chiamando INSTR() senza passare alcun argomento genera un errore:

SELECT INSTR()
FROM DUAL;

Risultato:

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:

E anche passare troppi argomenti provoca un errore:

SELECT INSTR('Big fat cat', 'at', 1, 2, 3)
FROM DUAL;

Risultato:

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: