MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Comment REGEXP_INSTR() fonctionne dans MariaDB

Dans MariaDB, le REGEXP_INSTR() renvoie l'index de départ d'une sous-chaîne qui correspond au modèle d'expression régulière.

L'index commence à 1 . S'il n'y a pas de correspondance, le résultat est 0 .

Syntaxe

La syntaxe ressemble à ceci :

REGEXP_INSTR(subject, pattern)

subject est la chaîne d'entrée et le pattern est le modèle d'expression régulière pour la sous-chaîne.

Notez qu'au moment de la rédaction, la version de MariaDB de REGEXP_INSTR() accepte moins d'arguments que REGEXP_INSTR() de MySQL . La version de MySQL vous permet de fournir des arguments pour la position de départ de la recherche, l'occurrence à rechercher, le type de position à renvoyer, ainsi qu'un moyen d'affiner l'expression régulière.

Exemple

Voici un exemple de base :

SELECT REGEXP_INSTR('Cat', 'at');

Résultat :

+---------------------------+
| REGEXP_INSTR('Cat', 'at') |
+---------------------------+
|                         2 |
+---------------------------+

Dans ce cas, il y a correspondance et la sous-chaîne commence à la position 2.

Aucune correspondance

Voici un exemple où il n'y a pas de correspondance :

SELECT REGEXP_INSTR('Cat', '^at');

Résultat :

+----------------------------+
| REGEXP_INSTR('Cat', '^at') |
+----------------------------+
|                          0 |
+----------------------------+

Il n'y a pas de correspondance, donc le résultat est 0 . Il n'y a pas de correspondance car j'ai spécifié que la chaîne doit commencer par la sous-chaîne.

Modifions-le pour qu'il le fasse commencer par cette sous-chaîne :

SELECT REGEXP_INSTR('at', '^at');

Résultat :

+---------------------------+
| REGEXP_INSTR('at', '^at') |
+---------------------------+
|                         1 |
+---------------------------+

Sensibilité à la casse

Le REGEXP_INSTR() suit les règles de sensibilité à la casse du classement effectif. La correspondance est effectuée de manière insensible à la casse pour les classements insensibles à la casse, et sensible à la casse pour les classements sensibles à la casse et pour les données binaires.

Voici un exemple :

SELECT 
    REGEXP_INSTR('Cat', 'c') AS "My Default",
    REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_ci, 'c') AS "Case Insensitive",
    REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_cs, 'c') AS "Case Sensitive";

Résultat :

+------------+------------------+----------------+
| My Default | Case Insensitive | Case Sensitive |
+------------+------------------+----------------+
|          1 |                1 |              0 |
+------------+------------------+----------------+

Mon classement par défaut est insensible à la casse. Les deux autres chaînes ont été forcées respectivement à un classement insensible à la casse et à un classement sensible à la casse.

Fournir un BINARY la chaîne est également sensible à la casse (voir ci-dessous).

Chaînes binaires

Par défaut, les positions sont mesurées en caractères plutôt qu'en octets. Cependant, vous pouvez convertir un jeu de caractères multi-octets en BINARY pour obtenir des décalages en octets si nécessaire.

Exemple :

SELECT 
    REGEXP_INSTR('© Cat', 'C') AS "Character",
    REGEXP_INSTR(BINARY '© Cat', 'C') AS "Binary";

Résultat :

+-----------+--------+
| Character | Binary |
+-----------+--------+
|         3 |      4 |
+-----------+--------+

Le symbole de copyright utilise deux octets, et donc dans cet exemple nous obtenons un résultat de 4 lors de la conversion en BINARY , contre 3 que nous obtenons autrement.

Notez bien que le passage d'un BINARY chaîne affecte également la sensibilité à la casse. Avec BINARY chaînes, un caractère majuscule est différent de son homologue minuscule :

SELECT 
    REGEXP_INSTR('© Cat', 'c') AS "Character",
    REGEXP_INSTR(BINARY '© Cat', 'c') AS "Binary";

Résultat :

+-----------+--------+
| Character | Binary |
+-----------+--------+
|         3 |      0 |
+-----------+--------+

Ici, j'ai cherché un c minuscule au lieu d'une majuscule, et le BINARY la chaîne ne correspondait pas.

Arguments nuls

Passer null car tout argument donne null :

SELECT 
    REGEXP_INSTR(null, 'c') AS "1",
    REGEXP_INSTR('Cat', null) AS "2",
    REGEXP_INSTR(null, null) AS "3";

Résultat :

+------+------+------+
| 1    | 2    | 3    |
+------+------+------+
| NULL | NULL | NULL |
+------+------+------+

Mauvais nombre d'arguments

Passer le mauvais nombre d'arguments ou aucun argument, entraîne une erreur :

SELECT REGEXP_INSTR('Cat');

Résultat :

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_INSTR'