La plupart des principaux SGBD nous permettent de trouver une chaîne dans une chaîne à l'aide de SQL. J'entends par là utiliser une requête SQL pour trouver la position d'une sous-chaîne dans une chaîne.
Il existe plusieurs fonctions SQL qui nous permettent de le faire, notamment INSTR()
, LOCATE()
, POSITION()
, et CHARINDEX()
. La fonction que vous utiliserez dépendra de votre SGBD et éventuellement si vous devez ou non spécifier une position de départ.
Oracle
Oracle a un INSTR()
fonction qui renvoie la position de départ d'une sous-chaîne donnée dans une chaîne.
Exemple :
SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;
Résultat :
5
Cela nous montre que la sous-chaîne fat
commence à la position 5 dans la chaîne Big fat cat
.
Il est possible de spécifier une position de départ en passant un troisième argument. Nous pouvons également passer un quatrième argument pour spécifier quelle occurrence rechercher :
SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;
Résultat :
7
Dans ce cas, j'ai commencé la recherche à la position 1
et recherché la deuxième occurrence (en utilisant 2
comme quatrième argument).
Oracle a aussi un INSTRB()
fonction qui fait la même chose, sauf qu'elle renvoie la position en octets.
MySQL
MySQL a un INSTR()
fonction qui fait une chose similaire à la fonction du même nom d'Oracle Database :
SELECT INSTR('Cats and dogs like to run', 'dogs');
Résultat :
10
Cependant, si vous devez spécifier une position de départ, vous devrez utiliser soit LOCATE()
ou POSITION()
:
SELECT LOCATE('cat', 'One cat jumped over the other cat', 6);
Résultat :
31
Ici, la première occurrence de cat
commence à la position 5, mais j'ai spécifié que la recherche devait commencer à la position 6. Par conséquent, la position de la prochaine occurrence de cette chaîne était celle qui était renvoyée.
Notez que, bien que la recherche ait commencé à la position 6, la fonction renvoie toujours la position de la sous-chaîne dans la chaîne - pas à partir de la position de départ.
Le POSITION()
la fonction est un synonyme de la syntaxe à deux arguments de LOCATE()
, mais avec une syntaxe légèrement différente (POSITION()
ne nous permet pas de spécifier une position de départ).
MySQL a aussi un REGEX_INSTR()
fonction qui renvoie l'index de départ de la sous-chaîne de la chaîne qui correspond à l'expression régulière spécifiée par le modèle spécifié.
MariaDB
Comme MySQL, MariaDB a aussi un INSTR()
fonction, ainsi qu'un un LOCATE()
et POSITION()
fonction :
SELECT
INSTR('No news is good news', 'news') AS "INSTR",
POSITION('news' IN 'No news is good news') AS "POSITION",
LOCATE('news', 'No news is good news') AS "LOCATE 1",
LOCATE('news', 'No news is good news', 5) AS "LOCATE 2";
Résultat :
+-------+----------+----------+----------+ | INSTR | POSITION | LOCATE 1 | LOCATE 2 | +-------+----------+----------+----------+ | 4 | 4 | 4 | 17 | +-------+----------+----------+----------+
MariaDB a aussi un REGEX_INSTR()
fonction qui renvoie l'index de départ de la sous-chaîne de la chaîne qui correspond à l'expression régulière spécifiée par le modèle spécifié.
SQL Server
En ce qui concerne SQL Server, le CHARINDEX()
fonction est ce que nous recherchons :
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Résultat :
17
Dans ce cas, j'ai utilisé le troisième argument facultatif pour spécifier une position de départ.
SQL Server a également un PATINDEX()
fonction qui recherche un motif dans une chaîne.
SQLite
SQLite a un INSTR()
fonction pour satisfaire nos besoins :
SELECT INSTR('Black cat', 'lack');
Résultat :
2
PostgreSQL
Dans PostgreSQL, nous devons utiliser le POSITION()
fonction :
SELECT POSITION('Break' IN 'Bangkok Breaking');
Résultat :
9