Dans Oracle, le INSTR()
La fonction recherche une sous-chaîne dans une chaîne donnée, et retourne un entier indiquant la position du premier caractère de cette sous-chaîne. Si la sous-chaîne n'est pas trouvée, la fonction renvoie 0
.
INSTR()
nécessite au moins deux arguments ; la chaîne et la sous-chaîne. Il accepte également un troisième et un quatrième arguments facultatifs qui vous permettent de spécifier la position de départ à rechercher et l'occurrence à rechercher.
INSTR()
peut également être considéré comme un ensemble de fonctions. Il y a cinq fonctions distinctes ; INSTR()
, INSTRB()
, INSTRC()
, INSTR2()
, et INSTR4()
. Chaque fonction calcule la longueur d'une manière différente.
Syntaxe
La syntaxe ressemble à ceci :
{ INSTR
| INSTRB
| INSTRC
| INSTR2
| INSTR4
}
(string , substring [, position [, occurrence ] ])
Où string
est la chaîne à rechercher, substring
est la sous-chaîne à rechercher, position
est la position de départ de la sous-chaîne, et occurrence
est quelle occurrence rechercher.
Les fonctions calculent les longueurs comme suit :
Fonction | Calcule la longueur en utilisant… |
---|---|
INSTR() | Caractères tels que définis par le jeu de caractères d'entrée, le premier caractère de la chaîne ayant la position 1. |
INSTRB() | Octets |
INSTRC() | Caractères complets Unicode |
INSTR2() | Points de code UCS2 |
INSTR4() | Points de code UCS4 |
Exemple
Voici un exemple de base :
SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;
Résultat :
5
Par rapport à INSTRB()
Cet exemple montre comment les résultats peuvent différer, selon la fonction spécifique que vous utilisez et le jeu de caractères impliqué.
Dans ce cas, nous comparons INSTR()
avec 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;
Résultat :
INSTR INSTRB ________ _________ 7 9
Nous pouvons voir que les deux fonctions ont renvoyé deux résultats différents. Cela est dû au fait que certains caractères de cette chaîne utilisent deux octets.
Le INSTR()
La fonction renvoie la position telle que définie par le jeu de caractères d'entrée, alors que la fonction INSTRB()
la fonction renvoie la position en octets .
Si nous revenons à la chaîne d'origine, les résultats sont les mêmes entre les deux fonctions :
SELECT
INSTR('Big fat cat', 'fat') AS INSTR,
INSTRB('Big fat cat', 'fat') AS INSTRB
FROM DUAL;
Résultat :
INSTR INSTRB ________ _________ 5 5
C'est parce que cette chaîne utilise un seul octet par caractère, et donc la longueur en octets est la même que le nombre de caractères.
Position de départ
Voici un exemple qui spécifie la position pour laquelle lancer la recherche :
SELECT INSTR('That fat cat', 'at', 8)
FROM DUAL;
Résultat :
11
Dans ce cas, la recherche commence à la position 8, qui est après les deux premières occurrences. Par conséquent, nous obtenons la position du troisième match.
Spécifier quelle occurrence
Voici un exemple de spécification de l'occurrence à rechercher :
SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;
Résultat :
7
Dans ce cas, nous avons commencé à la position 1, puis avons recherché la deuxième occurrence à partir de cette position de départ.
Le voici à nouveau, mais cette fois nous comparons trois valeurs différentes pour l'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;
Résultat :
o1 o2 o3 _____ _____ _____ 3 7 11
Mais voici ce qui se passe si nous augmentons la 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;
Résultat :
o1 o2 o3 _____ _____ _____ 7 11 0
Dans ce cas, nous n'obtenons pas la position de la première occurrence, car elle est située avant notre position de départ. Nous obtenons également 0
dans la troisième colonne car il n'y a pas de troisième occurrence, en fonction de notre position de départ.
Position négative
Si vous spécifiez une valeur négative pour la position, la position de départ est comptée à rebours à partir de la fin de la chaîne, et Oracle effectue une recherche à rebours à partir de cette position :
SELECT INSTR('That fat cat', 'at', -3)
FROM DUAL;
Résultat :
7
Et toute occurrence spécifiée est comptée à rebours à partir de cette position :
SELECT INSTR('That fat cat', 'at', -3, 2)
FROM DUAL;
Résultat :
3
Arguments nuls
Si l'un (ou tous) des arguments est null
, le résultat est 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;
Résultat :
R1 R2 R3 R4 _______ _______ _______ _______ null null null null
Par défaut, SQLcl et SQL*Plus renvoient un espace vide chaque fois que null
se produit à la suite d'un SQL SELECT
déclaration.
Cependant, vous pouvez utiliser SET NULL
pour spécifier une autre chaîne à renvoyer. Ici, j'ai précisé que la chaîne null
doit être retourné.
Nombre d'arguments incorrects
Appel de INSTR()
sans passer d'arguments entraîne une erreur :
SELECT INSTR()
FROM DUAL;
Résultat :
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:
Et passer trop d'arguments entraîne également une erreur :
SELECT INSTR('Big fat cat', 'at', 1, 2, 3)
FROM DUAL;
Résultat :
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: