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: